前段時間參加面試時,被乙個面試官問到thread中join方法用法,那會自己答得有點唐突吧,面試官對我的回答好像不是很滿意!
1.首先來說說執行緒thread的join方法:
join方法顧名思義 就是往執行緒中新增東西的;join方法可以用於臨時加入執行緒,乙個執行緒在運算過程中,如果滿足於條件,我們可以臨時加入乙個執行緒,讓這個執行緒運算完,另外乙個執行緒再繼續執行。
執行結果:
/*** join方法可以用於臨時加入執行緒,乙個執行緒在運算過程中,如果滿足於條件,
* 我們可以臨時加入乙個執行緒,讓這個執行緒運算完,另外乙個執行緒再繼續執行。
* @author leo-zeng**/
public
class
jointest
}class
threadtest
implements
runnable
public string getname
()
@override
public
void
run()}}
one——0
one——1
one——2
one——3
one——4
two——0
two——1
two——2
two——3
two——4
主線程向下轉時,碰到了t1.join(),t1要申**入到執行中來,就是要cpu執行權。這時候cpu執行權在主線程手裡,主線程就把cpu執行權給放開,陷入凍結狀態。 活著的只有t1了,只有當t1拿著執行權把這些資料都列印完了,主線程才恢復到執行中來;這就是呼叫join方法的用法。
2.看下sleep、yield方法:
thread.yield()方法暫停當前正在執行的執行緒物件,並執行其他執行緒。也就是交出cpu一段時間(其他同樣的優先順序或者更高優先順序的執行緒可以獲取到執行的機會);不會釋放鎖資源。
而thread.sleep()方法使當前執行緒進入停滯狀態,所以執行sleep()的執行緒在指定的時間內肯定不會執行, 同時sleep函式不會釋放鎖資源;sleep可使優先順序低的執行緒得到執行的機會,當然也可以讓同優先順序和高優先順序的執行緒有執行的機會。
這兩個的區別在於yield只能是同級,或者高階優先執行,而sleep可以低階,同級都可以有優先執行機會。
看以下兩個demo
如果不用yield()方法的話,兩個執行緒應該是交替進行的,用了yield()之後,cpu會多交出一些時間給ti優先執行。
public
class
yieldtest
}class
threadtest2
implements
runnable
public string getname
()
@override
public
void
run()
; }}
使用sleep的話,隨機性就大一些。
*/public
class
sleeptest
}class
threadtest3
implements
runnable
catch (interruptedexception e) };}
}
3.wait(),notify()方法
順便說下object 類的wait()方法和notify()方法,注意這個不是thread類的方法;還有這兩個方法主要是操作鎖標誌的,所以只能在synchronized方法或者synchronized block中
使用;wait()方法在睡眠的時候會放開鎖,給其他的執行緒使用。wait()有兩種方式獲得鎖:1.wait(longtimeout),通過設定時間來獲得鎖,值得注意的是,timeout這個時間到了以後,它不會立即醒來,而是要看那個正在使用這把鎖的執行緒是否結束。2.通過notify()的方法,通知需要這把鎖的wait(),使之喚醒,還有wait 方法也要和sleep方法區別,上面說到sleep方法是不釋放鎖資源的。
java中的Thread類的join
join是thread的例項方法,官方解釋為 等待該執行緒終止。其作用就是將呼叫join的執行緒優先執行,當前正在執行的執行緒阻塞,直到呼叫join方法的執行緒執行完畢或者被打斷,主要用於執行緒之間的互動。還有兩個過載的方法 1 join long millis 等待該執行緒終止的時間最長為 mil...
Thread的join的用法(執行緒執行排序)
執行緒必須要先start,才能join,只有啟動了,才能對執行緒進行操作。如有乙個執行緒叫a,那麼請看以下示例 a.start 啟動a執行緒 a.join 邀請a執行緒先執行,本執行緒先暫停執行,等待a執行緒執行完後,主線程再接著往下執行 system.out.println ok 這句話,要等到a...
java中Thread類的join方法
單核cpu執行多執行緒時底層實現原理是多個執行緒間切換,由於cpu的處理速度很快,看上去像多個執行緒同時執行。那麼我們如何實現讓執行緒t1,t2,t3,在t1執行完成後才執行t2,t2執行完成後才執行t3,也就是執行緒的序列化,通過thread類的join方法就可以實現。join方法 將該執行緒加入...