1. 程式人生 > >Thread 執行緒常用的兩種建立方式

Thread 執行緒常用的兩種建立方式

Thread 執行緒常用的兩種建立方式

相關的方法

Thread() - 使用無參方式構造物件。
Thread(String name) - 根據引數指定的名稱構造物件。
Thread(Runnable target) - 根據引數指定的介面引用構造物件。
Thread(Runnable target, String name) - 根據引用和名稱構造物件。

void run()
- 當執行緒物件是採用Runnable引用構造時,則最終呼叫Runnable引用指向的run方法。
- 否則呼叫該方法則表示什麼也不做。
void start()
- 用於啟動執行緒,Java虛擬機器會自動呼叫該執行緒的run()方法。

原理分析

a.執行main()方法的執行緒叫做主執行緒,執行run()方法的執行緒叫做新/子執行緒。
b.對於start()方法之前的程式碼來說,由主執行緒執行一次,當start()方法呼叫成功之後,則執行緒的個數瞬間由1個變成了2個,其中新啟動的執行緒去執行run()方法,而主執行緒繼續向下執行,兩個執行緒各自獨立執行。
c.當run()方法結束後,則子執行緒終止;當main()方法結束後,則主執行緒結束。

注意:
執行緒建立的方式一相對來說程式碼簡單,但該類繼承Thread類後就無法繼承其它類,而建立的方式二相對程式碼複雜,但不影響該類繼承其它類以及實現其它介面,因此推薦第二種方式。

執行緒的主要狀態

新建狀態 - 當使用new關鍵字建立物件之後進入的狀態。
- 此時執行緒還沒有開始執行。
就緒狀態 - 當執行緒物件呼叫start()方法後進入的狀態。
- 此時執行緒依然沒有開始執行。
執行狀態 - 當就緒的執行緒被執行緒排程器排程之後進入的狀態。
- 此時執行緒開始執行。
- 當執行緒的時間片執行完畢但任務還沒有完成時回到就緒狀態。
消亡狀態 - 當執行緒的時間片執行完畢且任務已經完成後進入的狀態。
- 此時執行緒已經終止。
阻塞狀態 - 當執行緒執行的過程中發生阻塞事件後進入的狀態,如:呼叫sleep()方法。
- 當阻塞狀態被解除之後則回到就緒狀態。

1,自定義類繼承Thread類並重寫run()方法,然後建立該類的物件並重寫start()方法

因為Thread 類裡面實現了Runnable介面
public class TestThread extends Thread{

@Override
public void run(){
	for(int i=0; i<20; i++){
		System.out.println("run方法中:i=" +i);
	}
}
public static void main(String[] args) {
	//使用子類型別的引用指向子類自己的物件,沒有多型
	TestThread test = new TestThread();
	//呼叫run()本質就是成員方法的呼叫機制,該方法實際沒有啟動執行緒,還是會按照順序執行
	//test.run(); 
	//呼叫start()方法,該方法啟動執行緒,執行順序是隨機的
	test.start();
	for(int i=0; i<20; i++){
		System.out.println("--------main方法中:i=" +i);
	}

}

}

2.自定義類實現Runnable介面並重寫run()方法,然後建立該類物件作為實參構造

Thread類的物件,最後使用Thread類物件呼叫start()方法。

public class TestSubRunnableStart implements Runnable {

@Override
public void run() {
	for(int i = 0; i < 20; i++){
		System.out.println("run方法中:i = " + i);
	}
}

public static void main(String[] args) {
	
	//1.建立TestSubRunnableStart型別的物件
	TestSubRunnableStart tsrs = new TestSubRunnableStart();
	//2.作為實參來構造Thread型別的物件
	Thread t1 = new Thread(tsrs);
	//3.使用Thread型別的物件呼叫start()方法
	t1.start();
	
	for(int i = 0; i < 20; i++){
		System.out.println("------------main方法中:i = " + i);
	}
}

}