JAVA中JOIN和WAIT的關係

2021-08-21 15:30:03 字數 2659 閱讀 2810

首先上**1:

執行結果1:

執行結果2:

thread-0 running ...

thread-0 end ...

main end !!!

可以知道,join方法,可以使得某個執行緒阻塞執行,讓出cpu給其他執行緒,此示例就是,main執行緒被阻塞執行讓出cpu給timerthread執行緒,知道timerthread執行緒執行結束後,main執行緒才會繼續執行。

然後,進入join原始碼看下:

可以看出,呼叫了wait方法。wait方法大家一定比我熟悉,這裡不多說。但是不禁有個疑問?為什麼不是timerthread執行緒阻塞而是main執行緒阻塞?帶著這個疑問,我們繼續往下看。

乙個執行緒執行結束後,會做什麼?有這麼一段**,如下:

執行main函式**:

test2 test = new test2();

thread2 thread2 = test.new thread2();

thread1 thread1 = test.new thread1(thread2);

thread2.start();

thread1.start();

執行結果:

enter thread2

enter thread1

thread2 synchronized begin

thread2 wait begin...

thread2 wait over ,cost 3 秒

分析:

有兩個執行緒,thread1和thread2,thread1持有thread2的執行緒物件鎖,thread2乙個耗時3秒的操作。執行時,先進入thread2(當然也可能先進入thread1),thread1進入同步**塊之前先獲取到thread2的物件鎖,獲取到鎖之後繼續執行,然後一直到wait方法,thread1就暫停執行,此時肯定還沒到3秒,thread1暫停後,thread2在3秒後結束執行,此時,神奇的是thread1又繼續開始執行了。由於thread1持有的鎖是thread2物件,所以只有當thread1收到乙個notify的通知並且通知的持有的鎖物件是thread2的時候,才有可能繼續執行,所以,可以斷定,thread2在執行結束之後,會發乙個notifyall到其他執行緒,而通知的鎖物件就是thread2自己。而當thread1收到notify通知後,會再去獲取thread2鎖,如果獲取到了鎖就會繼續執行,如果獲取不到則會等待鎖的釋放後再去競爭。

我們再來看一段**:

執行結果:

main join begin

thread1 run

thread1 end

main join end ,cost 2 秒

main end

結果分析:

thread1執行後呼叫了自己寫的join方法(不是原生的join方法),由於thread1.start();後,由於thread1.isalive()就為true了,所以會進入wait**,但是,重點來了,呼叫wait的**,和呼叫wait的物件無關,只和呼叫wait的執行緒有關。此時的wait(0)就等效於this.wait(0),this是thread1,但是雖然是thread1呼叫的wait,但是可以把thread1看作乙個普通的物件而已,在原始碼中,wait一定是得到當前的執行緒,然後進行後續的操作,所以,當前呼叫wait(0)的執行緒是main執行緒,所以main執行緒會被阻塞。加上,由於阻塞的時候的鎖物件是this,也就是thread1,所以,當thread1自己執行結束後,會notifyall所有持有thread1的鎖的在wait狀態下的其他執行緒(此處為main執行緒),所以main執行緒就會在thread1執行結束之後繼續執行。

so當呼叫原生的join方法時,也是呼叫了wait方法,也就是會阻塞呼叫的執行緒(切記不是呼叫join方法的那個執行緒物件,這只是乙個普通物件而已),所以,一切就都可以理解了。。。

java中sleep 和wait 的區別

sleep方法是thread類中定義的方法,而wait方法是object類中定義的方法。每個物件都有乙個鎖來控制同步訪問,synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。執行sleep 方法的執行緒會主動讓出cpu 然後cpu就可以去執行其他任務 在sleep指定時間後cp...

java中sleep和wait的區別

結合synchronized,會更好的理解sleep 和wait 這兩個方法,當然也就知道了他們的區別了。這篇部落格就一起學習這兩個方法 sleep 方法是執行緒類 thread 的靜態方法,讓呼叫執行緒進入睡眠狀態,讓出執行機會給其他執行緒,等到休眠時間結束後,執行緒進入就緒狀態和其他執行緒一起競...

Java中sleep 和wait 的區別

1.這兩個方法來自不同的類,sleep方法屬於thread,wait方法屬於object。2.最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。3.wait,notify和notifyall只能在同步控制方法 synchronized 或者同步控制塊...