日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我也学习JAVA多线程-join

發布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我也学习JAVA多线程-join 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【原文鏈接】:https://blog.tecchen.xyz ,博文同步發布到博客園。
由于精力有限,對文章的更新可能不能及時同步,請點擊上面的原文鏈接訪問最新內容。
歡迎訪問我的個人網站:https://www.tecchen.xyz 。

在工作中,挺少遇到join關鍵字,但很多多線程資料和面試過程中,初中級開發工程師總會遇到join。
今天一起學習下join。
join的作用:等待指定的時間(當為0時,一直等待),直到這個線程執行結束。
先看join方法的定義,join是java.lang.Thread的一個普通方法。

package java.lang;// Thread竟然實現了Runnable接口,之前好像注意到過,但是沒在意。 // 根據構造方法和run()方法可以看出,本質還是執行的Runnable的實現。 public class Thread implements Runnable {…public final void join() throws InterruptedException {join(0);}… }

演示代碼

public class ThreadLearnJoin {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "睡覺");try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "起床");}}, "sub-thread");t.start();System.out.println(Thread.currentThread().getName() + "線程join前");t.join();System.out.println(Thread.currentThread().getName() + "線程join后");} }

執行結果

main線程join前 sub-thread睡覺 sub-thread起床 main線程join后

源碼分析

繼續分析join(0)的代碼,首先需要注意的是synchronized關鍵字,其次是isAlive()和wait(0)。在演示代碼中,主線程調用名稱為sub-thread的子線程t的join()方法。
主線程先獲取t對象上的鎖,并且當t為Alive狀態時,繼續調用t的wait(0)方法。
由于wait()方法是Object的方法,跟子線程t并沒有關系,wait()會釋放t對象上的鎖,并阻塞當前main線程。
這里也就隱藏了一個點:t線程調用start()后,進入執行狀態,運行run()方法中的代碼,和t對象上的鎖并沒有任何關系。
run方法并沒有進入synchronized的同步區。

public final synchronized void join(long millis) throws InterruptedException {…if (millis == 0) {while (isAlive()) {wait(0);}}… }

參考資料

  • Java多線程系列--“基礎篇”08之 join()
    以下是Java多線程系列--“基礎篇”08之 join()的評論,可以幫助大家理解記憶。
問題:雖然s.join()被調用的地方是發生在“Father主線程”中,但是s.join()是通過“子線程s”去調用的join()。 那么,join()方法中的isAlive()應該是判斷“子線程s”是不是Alive狀態;對應的wait(0)也應該是“讓子線程s”等待才對。 但如果是這樣的話,s.join()的作用怎么可能是“讓主線程等待,直到子線程s完成為止”呢,應該是讓"子線程等待才對(因為調用子線程對象s的wait方法嘛)"? 答案:wait()的作用是讓“當前線程”等待,而這里的“當前線程”是指當前在CPU上運行的線程。所以,雖然是調用子線程的wait()方法,但是它是通過“主線程”去調用的; 所以,休眠的是主線程,而不是“子線程”!這個這么講的不清楚吧? 調用wait()方法 應該是當前線程持有的對象調用wait() 讓線程等,并釋放對象鎖。 在主線程中調用了s.join() join()方法用synchronized修飾了,也就是說當前主線程已經持有了s的鎖 這個調用s這個對象wait()方法 讓主線程等待并釋放s對象鎖。
  • Java join()使用及源碼分析

轉載于:https://www.cnblogs.com/Candies/p/10635419.html

總結

以上是生活随笔為你收集整理的我也学习JAVA多线程-join的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久视频免费看 | 天天操天天干天天爱 | 久久久久久艹 | 日本xxxx免费| 欧美在线视频免费 | 成人国产精品蜜柚视频 | 毛片麻豆 | 黄色网在线 | 婷婷五月在线视频 | 国产一区二区在线播放 | 伊人88| 国产尤物在线 | 特黄特色大片bbbb | 中国美女黄色 | 理想之城连续剧40集免费播放 | 亚洲图片在线观看 | 一级黄色美女 | 免费观看国产精品视频 | 99热视 | 免费看日韩毛片 | av在线超碰 | 懂色av蜜臀av粉嫩av喷吹 | 国产又色又爽 | 精品国产99久久久久久宅男i | 精品三区视频 | 日日干天天 | 久久国产影视 | 人成网站在线观看 | jizz性欧美2 视频在线日韩 | 欧美a免费 | 91高潮大合集爽到抽搐 | av资源部 | 清纯唯美第一页 | 亚州综合 | 午夜精品久久久久久久99热黄桃 | xxxx毛片 | 99国产精品久久 | 天堂精品视频 | 粉嫩av蜜桃av蜜臀av | 天天亚洲| 69国产视频| 欧美啪啪一区二区 | 精品无码免费视频 | 精品裸体舞一区二区三区 | 波多野结衣办公室33分钟 | 欧美91av | 99热网 | 国产第九页 | 三级av在线 | 熊猫电影yy8y全部免费观看 | 国产精品一区一区三区 | 91亚洲精品久久久蜜桃借种 | 国产丝袜av | 婷婷一区二区三区四区 | 无码人妻精品一区二区三应用大全 | 中文 日韩 欧美 | 美女露胸软件 | 欧美欧美欧美欧美 | av免费观看不卡 | 午夜之声l性8电台lx8电台 | 97国产成人无码精品久久久 | 少妇被又大又粗又爽毛片久久黑人 | 夜夜爱爱 | 欧美精品黑人 | 先锋资源一区二区 | 亚洲成人中文 | 日日夜夜操视频 | 亚洲一区二区三区免费看 | 狠狠狠狠干| 男女日日| xxxxxx日本 | 成人午夜精品一区二区 | 久久久精品人妻一区二区三区 | 91免费视频网 | 天海翼一区二区 | 伊人久色| 国产精品suv一区二区三区 | 鲁丝片一区二区三区 | 黄色小视频在线观看免费 | 让男按摩师摸好爽视频 | 精品91久久久久久 | 成人免费视频一区二区三区 | 少妇人妻无码专区视频 | 国产精品一区二区6 | 高清久久久久久 | 一级a性色生活片久久毛片 爱爱高潮视频 | 少妇被又大又粗又爽毛片久久黑人 | 欧美激情视频在线 | 亚洲色图网址 | 欧美激情图片 | 美日毛片 | 久久曹| 成人区精品一区二区婷婷 | 国产精品综合网 | 一级黄色免费 | 黑丝美女av| 国产激情精品一区二区三区 | 国产精品老牛影视 | 金瓶狂野欧美性猛交xxxx |