java基礎-JAVA之多執行緒
------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------
要想了解執行緒,先了解程序的概念程序:
程序:是一個正在執行中的程式。每一個程序執行都有一個執行順序,該順序是一個執行路徑,或者叫一個控制單元。
1、執行緒的概念:
執行緒:就是程序中的一個獨立的控制單元,執行緒在控制著程序的執行;一個程序中至少有一個執行緒。
java中要想實現多執行緒,有兩種手段,
一種是繼續Thread類,另外一種是實現Runable介面。
通過繼承Thread類來建立執行緒的方法。類Thread1宣告為Thread的子類,它的構造方法定義執行緒名和起始引數。
程式如下:
public class Thread1 extends Thread { int k=0; public Thread1(String name,int k) { super(name); this.k = k; } public void run() //覆蓋run方法的執行緒體 int i = k; System.out.println(); System.out.print(getName()+": "); while (i<50) { System.out.print(i+" "); i+=2; } System.out.println(getName() +" end!"); } public static void main (String args[]) { Thread1 t1 = new Thread1("Thread1",1); //建立執行緒物件 Thread1 t2 = new Thread1("Thread2",2); t1.start(); //啟動執行執行緒 t2.start(); System.out.println("activeCount="+t2.activeCount()); } }
2、建立執行緒的步驟:
1.定義一個類實現Runnable介面,重寫介面中的run()方法。在run()方法中加入具體的任務程式碼或處理邏輯。
2.建立Runnable介面實現類的物件。
3.建立一個Thread類的物件,需要封裝前面Runnable介面實現類的物件。(介面可以實現多繼承)
4.呼叫Thread物件的start()方法,啟動執行緒
3、執行緒的四種狀態:public class Thread1 extends Thread { int k=0; public Thread1(String name,int k) { super(name); this.k = k; } public void run() }
新狀態: 一個新產生的執行緒從新狀態開始了它的生命週期。它保持這個狀態知道程式start這個執行緒。
執行狀態:當一個新狀態的執行緒被start以後,執行緒就變成可執行狀態,一個執行緒在此狀態下被認為是開始執行其任務
就緒狀態:當一個執行緒等待另外一個執行緒執行一個任務的時候,該執行緒就進入就緒狀態。當另一個執行緒給就緒狀態的執行緒傳送訊號時,該執行緒才重新切換到執行狀態。
休眠狀態: 由於一個執行緒的時間片用完了,該執行緒從執行狀態進入休眠狀態。當時間間隔到期或者等待的時間發生了,該狀態的執行緒切換到執行狀態。
終止狀態: 一個執行狀態的執行緒完成任務或者其他終止條件發生,該執行緒就切換到終止狀態。
4、執行緒的使用:
4.1、建立一個執行緒,最簡單的方法是建立一個實現Runnable介面的類一個建立執行緒並開始讓它執行的例項:
// 建立一個新的執行緒
class NewThread implements Runnable {
Thread t;
NewThread() {
// 建立第二個新執行緒
t = new Thread(this, "Demo Thread");
System.out.println("Child thread: " + t);
t.start(); // 開始執行緒
}
// 第二個執行緒入口
public void run() {
try {
for(int i = 5; i > 0; i--) {
System.out.println("Child Thread: " + i);
// 暫停執行緒
Thread.sleep(50);
}
} catch (InterruptedException e) {
System.out.println("Child interrupted.");
}
System.out.println("Exiting child thread.");
}
}
public class ThreadDemo {
public static void main(String args[]) {
new NewThread(); // 建立一個新執行緒
try {
for(int i = 5; i > 0; i--) {
System.out.println("Main Thread: " + i);
Thread.sleep(100);
}
} catch (InterruptedException e) {
System.out.println("Main thread interrupted.");
}
System.out.println("Main thread exiting.");
}
}
執行結果如下:
Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.
4.2、通過繼承Thread來建立執行緒:
建立一個執行緒的第二種方法是建立一個新的類,該類繼承Thread類,然後建立一個該類的例項。
繼承類必須重寫run()方法,該方法是新執行緒的入口點。它也必須呼叫start()方法才能執行。
// 通過繼承 Thread 建立執行緒
class NewThread extends Thread {
NewThread() {
// 建立第二個新執行緒
super("Demo Thread");
System.out.println("Child thread: " + this);
start(); // 開始執行緒
}
// 第二個執行緒入口
public void run() {
try {
for(int i = 5; i > 0; i--) {
System.out.println("Child Thread: " + i);
// 讓執行緒休眠一會
Thread.sleep(50);
}
} catch (InterruptedException e) {
System.out.println("Child interrupted.");
}
System.out.println("Exiting child thread.");
}
}
public class ExtendThread {
public static void main(String args[]) {
new NewThread(); // 建立一個新執行緒
try {
for(int i = 5; i > 0; i--) {
System.out.println("Main Thread: " + i);
Thread.sleep(100);
}
} catch (InterruptedException e) {
System.out.println("Main thread interrupted.");
}
System.out.println("Main thread exiting.");
}
}
編譯以上程式執行結果如下:
Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.
5、多執行緒
有效利用多執行緒的關鍵是理解程式是併發執行而不是序列執行的。例如:程式中有兩個子系統需要併發執行,這時候就需要利用多執行緒程式設計。
通過對多執行緒的使用,可以編寫出非常高效的程式。不過請注意,如果建立太多的執行緒,程式執行的效率實際上是降低了,而不是提升了。
其中上下文的切換開銷也很重要,如果建立了太多的執行緒,CPU花費在上下文的切換的時間將多於執行程式的時間!
// 檔名 : DisplayMessage.java
// 通過實現 Runnable 介面建立執行緒
public class DisplayMessage implements Runnable
{
private String message;
public DisplayMessage(String message)
{
this.message = message;
}
public void run()
{
while(true)
{
System.out.println(message);
}
}
}
// 檔名 : GuessANumber.java
// 通過繼承 Thread 類建立執行緒
public class GuessANumber extends Thread
{
private int number;
public GuessANumber(int number)
{
this.number = number;
}
public void run()
{
int counter = 0;
int guess = 0;
do
{
guess = (int) (Math.random() * 100 + 1);
System.out.println(this.getName()
+ " guesses " + guess);
counter++;
}while(guess != number);
System.out.println("** Correct! " + this.getName()
+ " in " + counter + " guesses.**");
}
}
// 檔名 : ThreadClassDemo.java
public class ThreadClassDemo
{
public static void main(String [] args)
{
Runnable hello = new DisplayMessage("Hello");
Thread thread1 = new Thread(hello);
thread1.setDaemon(true);
thread1.setName("hello");
System.out.println("Starting hello thread...");
thread1.start();
Runnable bye = new DisplayMessage("Goodbye");
Thread thread2 = new Thread(bye);
thread2.setPriority(Thread.MIN_PRIORITY);
thread2.setDaemon(true);
System.out.println("Starting goodbye thread...");
thread2.start();
System.out.println("Starting thread3...");
Thread thread3 = new GuessANumber(27);
thread3.start();
try
{
thread3.join();
}catch(InterruptedException e)
{
System.out.println("Thread interrupted.");
}
System.out.println("Starting thread4...");
Thread thread4 = new GuessANumber(75);
thread4.start();
System.out.println("main() is ending...");
}
}
執行結果如下,每一次執行的結果都不一樣。
Starting hello thread...
Starting goodbye thread...
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Thread-2 guesses 27
Hello
** Correct! Thread-2 in 102 guesses.**
Hello
Starting thread4...
Hello
Hello
..........remaining result produced.
6、synchronized:
格式:
synchronized(物件)
{
需要同步的程式碼;
}
格式:
在函式上加上synchronized修飾符即可。
同步可以解決安全問題的根本原因就在那個物件上。
該物件如同鎖的功能。
6.1、同步特點:
前提:多個執行緒
解決問題注意:多個執行緒使用的是同一個鎖物件
6.2、同步好處:
同步解決了多執行緒的安全問題
6.3、同步的弊端:
當執行緒很多時,因為每個執行緒都會去判斷同步上的鎖,很消耗資源,降低程式的執行效率
相關推薦
Java基礎加強之多執行緒篇 - 執行緒建立與終止、互斥、通訊、本地變數
執行緒建立與終止 執行緒建立 Thread類與 Runnable 介面的關係 public interface Runnable { public abstract void run(); } public class Thread implements Run
黑馬程式設計師——java基礎拾遺之多執行緒(二) 執行緒同步、執行緒通訊
執行緒安全的概念:當多個執行緒同時執行一段程式碼時,如果結果和單執行緒執行時一致,而且其他變數也和預期的一致,說明是這段程式碼是執行緒安全的。但是,多執行緒執行的過程中會出現單執行緒時候不會出現的問題,大多出現在多個執行緒同時操作全域性變數或者靜態變數的時候。當出現這種
Java基礎筆記之多執行緒
1. 執行緒在程式中是獨立的,併發的執行流。當程序被初始化後,主執行緒就建立了。 2. 多執行緒程式設計的優點: 程序之間不能共享記憶體,但執行緒之間共享記憶體非常容易。 系統建立程序時需要為該程序重新分配系統資源,但建立執行緒則代價小得多,因此使用多執行緒來
Java學習筆記之——多執行緒
多執行緒程式設計 程式: 程序:一個程式執行就會產生一個程序 執行緒:程序的執行流程,一個程序至少有一個執行緒,稱為主執行緒 如:QQ聊著天,同時在聽音樂 一個程序可以有多個執行緒,多個執行緒共享同一個程序的資源 執行緒類:Tread 多執行緒程式設計: 方式一:繼承Thread (1)&n
java基礎知識總結--多執行緒
1、擴充套件Java.lang.Thread類 1.1、程序和執行緒的區別: 程序:每個程序都有自己獨立的程式碼和資料空間(程序上下文),程序間的切換會有較大的開銷,一個程序包含1~n個執行緒。  
java高階特性之多執行緒
java多執行緒知識點: 1、建立分執行緒的方式 2、單例模式懶漢式執行緒安全問題 3、java執行緒同步 4、java執行緒通訊 5、java的記憶體模型 認識執行緒: 每一個java程式都有一個隱含的主執行緒,即main()方法。 程式–&g
Java基礎 實驗六 多執行緒
一、實驗內容 在一個執行緒中求100以內素數,求出後休眠一個隨機時間。在另一執行緒中求100以內能被3整除的數,求出後休眠一個隨機時間。輸出資料時應有提示,指明哪個執行緒輸出的資料。 二、實驗程式碼 1、NewOneThread.java packag
Java網路程式設計之多執行緒Client-Server
前面廢話過了,現在就直接看程式碼吧! ThreadedClient.java package exercise01; import java.io.*; import java.net.*; public class ThreadedClient { privat
Java基礎之多執行緒及併發庫
實際上關於多執行緒的基礎知識,前面自己已經總結過一部分,但是每一個階段對於同樣知識點的學習側重點是不一樣的,前面的Java基礎總結八之多執行緒(一)和 Java基礎總結九之多執行緒(二)是對JDK5以前多執行緒相關基礎知識的一個簡單總結,今天本文將偏重於JDK5提供的併發庫進行學習總結。 首先,
黑馬程式設計師----Java基礎之多執行緒
------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g
【紮實基本功】Java基礎教程系列之多執行緒
1. 多執行緒的概念 1.1 程序、執行緒、多程序的概念 程序:正在進行中的程式(直譯)。 執行緒是程式執行的一條路徑, 一個程序中可以包含多條執行緒。 一個應用程式可以理解成就是一個程序。 多執行緒併發執行可以提高程式的效率, 可以同時完成多項工作。 1.
Java基礎之多執行緒-多生產多消費
使用場景請看上一篇部落格Java基礎之多執行緒-多生產多消費 話不多說,直接上程式碼: 顧客: package cn.itcast.day07.demo02; public class MultiConsumer implements Runnable { priva
Java基礎之多執行緒案例-單生產單消費
在講單生產單消費之前,我們先來說一下執行緒間通訊的問題 一、 執行緒間通訊 概念:多個執行緒在處理同一個資源,但是處理的動作(執行緒的任務)卻不相同。 比如:執行緒A用來生成包子的,執行緒B用來吃包子的,包子可以理解為同一資源,執行緒A與執行緒B處理的動作,一個是生產,一個是消費,
Java基礎之多執行緒之原理、實現方式及匿名內部類建立執行緒方法
一、概念 程序:作業系統當中正在執行的一個程式。例如正在執行一個QQ。 執行緒:程序之內多工的執行單位。例如迅雷當中正在下載的多個電影。 JVM當中:棧(Stack)記憶體是執行緒獨立的,堆(Heap)記憶體是執行緒共享的。 (1)Java程式執行的時候至少有兩個執行緒: 1)主
sincerit java基礎之多執行緒
執行緒狀態 Java執行緒具有五中基本狀態 新建狀態(New):當執行緒物件對建立後,即進入了新建狀態,如:Thread t = new MyThread(); 就緒狀態(Runnable):當呼叫執行緒物件的start()方法(t.start();),執行緒即進入就緒狀態。處於就
Java基礎之多執行緒
以下是我們Java基礎多執行緒的一些知識點總結: 執行緒中run()和start()的區別: 對於Thread物件來說,當你呼叫的是start(),執行緒會被放到等待佇列,等待CPU排程,不一定馬上執行;無需等待run()方法執行完畢,可以直接執行下面的程式碼; 而呼叫的是run()的話,就是當做普通的方
Java基礎複習一之多執行緒(併發,記憶體模型)
前言:畢業來北京轉眼一年半了,但是沒有太多的成績。沒有太多的記錄和沉澱。現在開始複習一下基礎的知識。涉及到的有多執行緒,集合,JVM,NIO,資料庫,作業系統。後面還是想走實時處理那一塊,可能會有那方面的研究。 多執行緒:為啥用?因為想去執行不同的任務,或利用現狀多核的處
java基礎之——多執行緒
程式碼體現: public class MyThread extends Thread { public void run() { for(int x=0; x<100; x++) { System.out.println(getName()+"--
java基礎-JAVA之多執行緒
------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 要想了解執行緒,先了解程序的概念程序: 程
Java基礎學習筆記之多執行緒
Java基礎之多執行緒 1.程序與執行緒 1)程序和執行緒都是一個時間段的描述,是CPU工作時間段的描述。 程序與執行緒都能夠完成多工 你打開了QQ,你開了一個程序,你打開了微信,你又開了一個程序,在QQ的這個程序裡,你與一個人的聊天開一個執行緒,