1. 程式人生 > >java執行緒學習(一): 多執行緒中start()和run()的區別

java執行緒學習(一): 多執行緒中start()和run()的區別

趁著有空,看看執行緒Thread的原始碼,挺有意思的 這裡來說說多執行緒中start()和run()的區別。
1-跟start()有關的原始碼:

public class Thread implements Runnable {	
private ThreadGroup group;
	public synchronized void start() {
		if (this.threadStatus != 0) {
			throw new IllegalThreadStateException();
		} else {
			this.group.add(this);
			boolean
var1 = false; try { this.start0(); var1 = true; } finally { try { if (!var1) { this.group.threadStartFailed(this); } } catch (Throwable var8) { ; } } } } private native void start0(); }

可以看到,如果呼叫了Thread的start()方法,就會通過this.group.add(this);把執行緒的資訊加入到執行緒組中,然後呼叫start0()本地方法,這個方法應該是c++或其他(系統)語言編寫的,雖然不知道具體的原始碼,但仔細一想,他應該是通過cpu的排程來管理執行緒的開啟和執行的吧。
而如果呼叫run方法的話:

	public void run() {
		if (this.target != null) {
			this.target.run();
		}
	}

這僅僅就是個普通的方法,跟CPU這些完全沒有關係,所以呼叫run()方法不會開啟任何一條執行緒,他僅僅在當前執行緒中執行而已。

2-兩種方法詳細的區別:

  • start:

API中對於該方法的介紹:

 使該執行緒開始執行;Java 虛擬機器呼叫該執行緒的 run 方法。

 結果是兩個執行緒併發地執行;當前執行緒(從呼叫返回給 start 方法)和另一個執行緒(執行其 run 方法)。

 多次啟動一個執行緒是非法的。特別是當執行緒已經結束執行後,不能再重新啟動。

用start方法來啟動執行緒,真正實現了多執行緒執行,這時無需等待run方法體程式碼執行完畢而直接繼續執行下面的程式碼。通過呼叫Thread類的 start()方法來啟動一個執行緒,這時此執行緒處於就緒(可執行)狀態,並沒有執行,一旦得到cpu時間片,就開始執行run()方法,這裡方法 run()稱為執行緒體,它包含了要執行的這個執行緒的內容,Run方法執行結束,此執行緒隨即終止。

  • run():

API中對該方法的介紹:

  如果該執行緒是使用獨立的 Runnable 執行物件構造的,則呼叫該 Runnable 物件的 run 方法;否則,該方法不執行任何操作並返回。

Thread 的子類應該重寫該方法。

run()方法只是類的一個普通方法而已,如果直接呼叫Run方法,程式中依然只有主執行緒這一個執行緒,其程式執行路徑還是隻有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的程式碼,這樣就沒有達到寫執行緒的目的。

總的來說: 呼叫start方法方可啟動執行緒,而run方法只是thread的一個普通方法呼叫,還是在主執行緒裡執行。