當前位置:首頁 » 編程語言 » java多線程join

java多線程join

發布時間: 2024-04-23 10:11:27

java澶氱嚎紼嬬殑闂棰樹負浣曡緭鍑虹粨鏋滃彧鏈変竴涓錛

1銆佷富瑕佹槸tt.join鐨勯棶棰樸
2銆佸綋瀛愮嚎紼嬪紑鍚鍚庯紝涓葷嚎紼嬪拰瀛愮嚎紼嬫槸騫跺彂鎴栧苟琛屾墽琛岀殑錛屼細澶氱嚎紼嬭緭鍑恆
浣嗘槸tt.join鏄鎸囧皢tt綰跨▼涓庝富綰跨▼錛堝嵆tt.join榪欐典唬鐮佹墍榪愯屾椂鍊欑殑綰跨▼錛夊悎騫訛紝鍗崇瓑tt.join榪愯屽畬鍚庢墽琛屽垰鍒氱殑涓葷嚎紼嬨
鑰屼綘鐨則t綰跨▼涓鐨剅un()鏂規硶涓猴細while(true)鎵浠tt.join涔嬪悗錛宼t涓鐩村湪榪愯岋紝
鏁呭彧鑳界湅涓涓綰跨▼鍦ㄨ繍琛屻

甯屾湜鑳借В鍐充綘鐨勯棶棰樸

⑵ java中join( )和yield方法有什麼區別和聯系

yield:理論上,yield意味著放手,放棄,投降。一個調用yield()方法的線程告訴虛擬機它樂意讓其他線程佔用自己的位置。這表明該線程沒有在做一些緊急的事情。注意,這僅是一個暗示,並不能保證不會產生任何影響。注意:它是一個靜態的原生(native)方法;它告訴當前正在執行的線程把運行機會交給線程池中擁有相同優先順序的線程;

它不能保證使得當前正在運行的線程迅速轉換到可運行的狀態;它僅能使一個線程從運行狀態轉到可運行狀態,而不是等待或阻塞狀態。

join:線程實例的方法join()方法可以使得一個線程在另一個線程結束後再執行。如果join()方法在一個線程實例上調用,當前運行著的線程將阻塞直到這個線程實例完成了執行。

packagetest;
publicclassYieldExample{
publicstaticvoidmain(String[]args){
Threadprocer=newProcer();
Threadconsumer=newConsumer();
procer.setPriority(Thread.MIN_PRIORITY);
consumer.setPriority(Thread.MAX_PRIORITY);
procer.start();
consumer.start();
}
}
classProcerextendsThread{
publicvoidrun(){
for(inti=0;i<5;i++){
System.out.println("IamProcer:ProcedItem"+i);
Thread.yield();
}
}
}
classConsumerextendsThread{
publicvoidrun(){
for(inti=0;i<5;i++){
System.out.println("IamConsumer:ConsumedItem"+i);
Thread.yield();
}
}
}

packagetest;
publicclassJoinExample{
publicstaticvoidmain(String[]args)throwsInterruptedException{
Threadt=newThread(newRunnable(){
publicvoidrun(){
System.out.println("Firsttaskstarted");
System.out.println("Sleepingfor2seconds");
try
{
Thread.sleep(2000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("Firsttaskcompleted");
}
});
Threadt1=newThread(newRunnable(){
publicvoidrun(){
System.out.println("Secondtaskcompleted");
}
});
t.start();
t.join();
t1.start();
}
}

⑶ 鍦↗ava 涓澶氱嚎紼嬬殑瀹炵幇鏂規硶鏈夊摢浜涳紝濡備綍浣跨敤鍀烇綖鍀烇綖鍀烇綖鍀烇綖鍀烇綖鍀烇綖鍀烇綖鍀烇綖鍀烇綖鎬

1銆 璁よ瘑Thread鍜孯unnable

Java涓瀹炵幇澶氱嚎紼嬫湁涓ょ嶉斿緞錛氱戶鎵縏hread綾繪垨鑰呭疄鐜癛unnable鎺ュ彛銆俁unnable鏄鎺ュ彛錛屽緩璁鐢ㄦ帴鍙g殑鏂瑰紡鐢熸垚綰跨▼錛屽洜涓烘帴鍙e彲浠ュ疄鐜板氱戶鎵匡紝鍐典笖Runnable鍙鏈変竴涓猺un鏂規硶錛屽緢閫傚悎緇ф壙銆傚湪浣跨敤Thread鐨勬椂鍊欏彧闇緇ф壙Thread錛屽苟涓攏ew涓涓瀹炰緥鍑烘潵錛岃皟鐢╯tart()鏂規硶鍗沖彲浠ュ惎鍔ㄤ竴涓綰跨▼銆

Thread Test = new Thread();

Test.start();

鍦ㄤ嬌鐢≧unnable鐨勬椂鍊欓渶瑕佸厛new涓涓瀹炵幇Runnable鐨勫疄渚嬶紝涔嬪悗鍚鍔═hread鍗沖彲銆

Test impelements Runnable;

Test t = new Test();

Thread test = new Thread(t);

test.start();

鎬葷粨錛歍hread鍜孯unnable鏄瀹炵幇java澶氱嚎紼嬬殑2縐嶆柟寮忥紝runable鏄鎺ュ彛錛宼hread鏄綾伙紝寤鴻浣跨敤runable瀹炵幇java澶氱嚎紼嬶紝涓嶇″備綍錛屾渶緇堥兘闇瑕侀氳繃thread.start()鏉ヤ嬌綰跨▼澶勪簬鍙榪愯岀姸鎬併

2銆 璁よ瘑Thread鐨剆tart鍜宺un

1錛 start錛

鐢╯tart鏂規硶鏉ュ惎鍔ㄧ嚎紼嬶紝鐪熸e疄鐜頒簡澶氱嚎紼嬭繍琛岋紝榪欐椂鏃犻渶絳夊緟run鏂規硶浣撲唬鐮佹墽琛屽畬姣曡岀洿鎺ョ戶緇鎵ц屼笅闈㈢殑浠g爜銆傞氳繃璋冪敤Thread綾葷殑start()鏂規硶鏉ュ惎鍔ㄤ竴涓綰跨▼錛岃繖鏃舵ょ嚎紼嬪勪簬灝辯華錛堝彲榪愯岋級鐘舵侊紝騫舵病鏈夎繍琛岋紝涓鏃﹀緱鍒皊pu鏃墮棿鐗囷紝灝卞紑濮嬫墽琛宺un()鏂規硶錛岃繖閲屾柟娉時un()縐頒負綰跨▼浣擄紝瀹冨寘鍚浜嗚佹墽琛岀殑榪欎釜綰跨▼鐨勫唴瀹癸紝Run鏂規硶榪愯岀粨鏉燂紝姝ょ嚎紼嬮殢鍗崇粓姝銆

2錛 run錛

run()鏂規硶鍙鏄綾葷殑涓涓鏅閫氭柟娉曡屽凡錛屽傛灉鐩存帴璋冪敤Run鏂規硶錛岀▼搴忎腑渚濈劧鍙鏈変富綰跨▼榪欎竴涓綰跨▼錛屽叾紼嬪簭鎵ц岃礬寰勮繕鏄鍙鏈変竴鏉★紝榪樻槸瑕侀『搴忔墽琛岋紝榪樻槸瑕佺瓑寰卹un鏂規硶浣撴墽琛屽畬姣曞悗鎵嶅彲緇х畫鎵ц屼笅闈㈢殑浠g爜錛岃繖鏍峰氨娌℃湁杈懼埌鍐欑嚎紼嬬殑鐩鐨勩

鎬葷粨錛氳皟鐢╯tart鏂規硶鏂瑰彲鍚鍔ㄧ嚎紼嬶紝鑰宺un鏂規硶鍙鏄痶hread鐨勪竴涓鏅閫氭柟娉曡皟鐢錛岃繕鏄鍦ㄤ富綰跨▼閲屾墽琛屻

3銆 綰跨▼鐘舵佽存槑

綰跨▼鐘舵佷粠澶х殑鏂歸潰鏉ヨ達紝鍙褰掔粨涓猴細鍒濆嬬姸鎬併佸彲榪愯岀姸鎬併佷笉鍙榪愯岀姸鎬佸拰娑堜骸鐘舵侊紝鍏蜂綋鍙緇嗗垎涓轟笂鍥炬墍紺7涓鐘舵侊紝璇存槑濡備笅錛

1錛 綰跨▼鐨勫疄鐜版湁涓ょ嶆柟寮忥紝涓鏄緇ф壙Thread綾伙紝浜屾槸瀹炵幇Runnable鎺ュ彛錛屼絾涓嶇℃庢牱錛屽綋鎴戜滑new浜唗hread瀹炰緥鍚庯紝綰跨▼灝辮繘鍏ヤ簡鍒濆嬬姸鎬侊紱

2錛 褰撹ュ硅薄璋冪敤浜唖tart()鏂規硶錛屽氨榪涘叆鍙榪愯岀姸鎬侊紱

3錛 榪涘叆鍙榪愯岀姸鎬佸悗錛屽綋璇ュ硅薄琚鎿嶄綔緋葷粺閫変腑錛岃幏寰桟PU鏃墮棿鐗囧氨浼氳繘鍏ヨ繍琛岀姸鎬侊紱

4錛 榪涘叆榪愯岀姸鎬佸悗case灝辨瘮杈冨氾紝澶ц嚧鏈夊備笅鎯呭艦錛

路run()鏂規硶鎴杕ain()鏂規硶緇撴潫鍚庯紝綰跨▼灝辮繘鍏ョ粓姝㈢姸鎬侊紱

路褰撶嚎紼嬭皟鐢ㄤ簡鑷韜鐨剆leep()鏂規硶鎴栧叾浠栫嚎紼嬬殑join()鏂規硶錛屽氨浼氳繘鍏ラ樆濉炵姸鎬(璇ョ姸鎬佹棦鍋滄㈠綋鍓嶇嚎紼嬶紝浣嗗苟涓嶉噴鏀炬墍鍗犳湁鐨勮祫婧)銆傚綋sleep()緇撴潫鎴杍oin()緇撴潫鍚庯紝璇ョ嚎紼嬭繘鍏ュ彲榪愯岀姸鎬侊紝緇х畫絳夊緟OS鍒嗛厤鏃墮棿鐗囷紱

路褰撶嚎紼嬪垰榪涘叆鍙榪愯岀姸鎬(娉ㄦ剰錛岃繕娌¤繍琛)錛屽彂鐜板皢瑕佽皟鐢ㄧ殑璧勬簮琚閿佺墷(synchroniza,lock)錛屽皢浼氱珛鍗寵繘鍏ラ攣奼犵姸鎬侊紝絳夊緟鑾峰彇閿佹爣璁(榪欐椂鐨勯攣奼犻噷涔熻稿凡緇忔湁浜嗗叾浠栫嚎紼嬪湪絳夊緟鑾峰彇閿佹爣璁幫紝榪欐椂瀹冧滑澶勪簬闃熷垪鐘舵侊紝鏃㈠厛鍒板厛寰)錛屼竴鏃︾嚎紼嬭幏寰楅攣鏍囪板悗錛屽氨杞鍏ュ彲榪愯岀姸鎬侊紝絳夊緟OS鍒嗛厤CPU鏃墮棿鐗囷紱

路褰撶嚎紼嬭皟鐢╳ait()鏂規硶鍚庝細榪涘叆絳夊緟闃熷垪(榪涘叆榪欎釜鐘舵佷細閲婃斁鎵鍗犳湁鐨勬墍鏈夎祫婧愶紝涓庨樆濉炵姸鎬佷笉鍚)錛岃繘鍏ヨ繖涓鐘舵佸悗錛屾槸涓嶈兘鑷鍔ㄥ敜閱掔殑錛屽繀欏諱緷闈犲叾浠栫嚎紼嬭皟鐢╪otify()鎴杗otifyAll()鏂規硶鎵嶈兘琚鍞ら啋(鐢變簬notify()鍙鏄鍞ら啋涓涓綰跨▼錛屼絾鎴戜滑鐢變笉鑳界『瀹氬叿浣撳敜閱掔殑鏄鍝涓涓綰跨▼錛屼篃璁告垜浠闇瑕佸敜閱掔殑綰跨▼涓嶈兘澶熻鍞ら啋錛屽洜姝ゅ湪瀹為檯浣跨敤鏃訛紝涓鑸閮界敤notifyAll()鏂規硶錛屽敜閱掓湁鎵綰跨▼)錛岀嚎紼嬭鍞ら啋鍚庝細榪涘叆閿佹睜錛岀瓑寰呰幏鍙栭攣鏍囪般

路褰撶嚎紼嬭皟鐢╯top鏂規硶錛屽嵆鍙浣跨嚎紼嬭繘鍏ユ秷浜$姸鎬侊紝浣嗘槸鐢變簬stop鏂規硶鏄涓嶅畨鍏ㄧ殑錛屼笉榧撳姳浣跨敤錛屽ぇ瀹跺彲浠ラ氳繃run鏂規硶閲岀殑鏉′歡鍙橀氬疄鐜扮嚎紼嬬殑stop銆

⑷ java 線程 join方法

您好,提問者:
當main線程調用到Thread-0的時候,這個時候main線程是等待狀態,直到join守護完畢才執行下面的東西。
join方法是先將線程池中的其它線程wait狀態,join執行完畢,又調用了notifyAll()喚醒所有線程中的線程。

熱點內容
sqlserver無法啟動 發布:2024-05-04 01:37:19 瀏覽:848
php使用正則 發布:2024-05-04 01:36:12 瀏覽:119
玉石密度演算法 發布:2024-05-04 01:24:49 瀏覽:334
我的世界雲伺服器怎麼樣 發布:2024-05-04 01:20:01 瀏覽:22
androidsdk包含 發布:2024-05-04 00:45:54 瀏覽:209
android拷貝文件 發布:2024-05-04 00:38:28 瀏覽:777
存儲冗餘比 發布:2024-05-04 00:12:58 瀏覽:405
oracle資料庫存儲原理 發布:2024-05-04 00:10:40 瀏覽:524
未拆封玩客雲3怎麼搭建伺服器 發布:2024-05-04 00:06:11 瀏覽:798
徹底刪除編譯安裝的文件 發布:2024-05-04 00:05:33 瀏覽:56