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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程交互

發(fā)布時間:2025/4/16 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程交互 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

?

本文出自 “熔 巖” 博客,轉(zhuǎn)載請與作者聯(lián)系!

線程交互是比較復(fù)雜的問題,SCJP要求不很基礎(chǔ):給定一個場景,編寫代碼來恰當(dāng)使用等待、通知和通知所有線程。

?

一、線程交互的基礎(chǔ)知識

?

SCJP所要求的線程交互知識點需要從java.lang.Object的類的三個方法來學(xué)習(xí):

?

?void notify()?
????????? 喚醒在此對象監(jiān)視器上等待的單個線程。?
?void notifyAll()?
????????? 喚醒在此對象監(jiān)視器上等待的所有線程。?
?void wait()?
????????? 導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法。

?

當(dāng)然,wait()還有另外兩個重載方法:

?void wait(long timeout)?
????????? 導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。?
?void wait(long timeout, int nanos)?
????????? 導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法,或者其他某個線程中斷當(dāng)前線程,或者已超過某個實際時間量。

?

以上這些方法是幫助線程傳遞線程關(guān)心的時間狀態(tài)。

?

關(guān)于等待/通知,要記住的關(guān)鍵點是:

必須從同步環(huán)境內(nèi)調(diào)用wait()、notify()、notifyAll()方法。線程不能調(diào)用對象上等待或通知的方法,除非它擁有那個對象的鎖。

wait()、notify()、notifyAll()都是Object的實例方法。與每個對象具有鎖一樣,每個對象可以有一個線程列表,他們等待來自該信號(通知)。線程通過執(zhí)行對象上的wait()方法獲得這個等待列表。從那時候起,它不再執(zhí)行任何其他指令,直到調(diào)用對象的notify()方法為止。如果多個線程在同一個對象上等待,則將只選擇一個線程(不保證以何種順序)繼續(xù)執(zhí)行。如果沒有線程等待,則不采取任何特殊操作。

?

下面看個例子就明白了:

/**?
* 計算輸出其他線程鎖計算的數(shù)據(jù)?
*?
* @author leizhimin 2008-9-15 13:20:38?
*/?
public?class?ThreadA {?
????public?static?void?main(String[] args) {?
????????ThreadB b =?new?ThreadB();?
????????//啟動計算線程?
????????b.start();?
????????//線程A擁有b對象上的鎖。線程為了調(diào)用wait()或notify()方法,該線程必須是那個對象鎖的擁有者?
????????synchronized?(b) {?
????????????try?{?
????????????????System.out.println("等待對象b完成計算。。。");?
????????????????//當(dāng)前線程A等待?
????????????????b.wait();?
????????????}?catch?(InterruptedException e) {?
????????????????e.printStackTrace();?
????????????}?
????????????System.out.println("b對象計算的總和是:"?+ b.total);?
????????}?
????}?
}

?

/**?
* 計算1+2+3 ... +100的和?
*?
* @author leizhimin 2008-9-15 13:20:49?
*/?
public?class?ThreadB?extends?Thread {?
????int?total;?

????public?void?run() {?
????????synchronized?(this) {?
????????????for?(int?i = 0; i < 101; i++) {?
????????????????total += i;?
????????????}?
????????????//(完成計算了)喚醒在此對象監(jiān)視器上等待的單個線程,在本例中線程A被喚醒?
????????????notify();?
????????}?
????}?
}

?

等待對象b完成計算。。。?
b對象計算的總和是:5050?

Process finished with exit code 0?

?

千萬注意:

當(dāng)在對象上調(diào)用wait()方法時,執(zhí)行該代碼的線程立即放棄它在對象上的鎖。然而調(diào)用notify()時,并不意味著這時線程會放棄其鎖。如果線程榮然在完成同步代碼,則線程在移出之前不會放棄鎖。因此,只要調(diào)用notify()并不意味著這時該鎖變得可用。

?

二、多個線程在等待一個對象鎖時候使用notifyAll()

?

在多數(shù)情況下,最好通知等待某個對象的所有線程。如果這樣做,可以在對象上使用notifyAll()讓所有在此對象上等待的線程沖出等待區(qū),返回到可運行狀態(tài)。

?

下面給個例子:

/**?
* 計算線程?
*?
* @author leizhimin 2008-9-20 11:15:46?
*/?
public?class?Calculator?extends?Thread {?
????????int?total;?

????????public?void?run() {?
????????????????synchronized?(this) {?
????????????????????????for?(int?i = 0; i < 101; i++) {?
????????????????????????????????total += i;?
????????????????????????}?
????????????????}?
????????????????//通知所有在此對象上等待的線程?
????????????????notifyAll();?
????????}?
}

?

/**?
* 獲取計算結(jié)果并輸出?
*?
* @author leizhimin 2008-9-20 11:15:22?
*/?
public?class?ReaderResult?extends?Thread {?
????????Calculator c;?

????????public?ReaderResult(Calculator c) {?
????????????????this.c = c;?
????????}?

????????public?void?run() {?
????????????????synchronized?(c) {?
????????????????????????try?{?
????????????????????????????????System.out.println(Thread.currentThread() +?"等待計算結(jié)果。。。");?
????????????????????????????????c.wait();?
????????????????????????}?catch?(InterruptedException e) {?
????????????????????????????????e.printStackTrace();?
????????????????????????}?
????????????????????????System.out.println(Thread.currentThread() +?"計算結(jié)果為:"?+ c.total);?
????????????????}?
????????}?

????????public?static?void?main(String[] args) {?
????????????????Calculator calculator =?new?Calculator();?

????????????????//啟動三個線程,分別獲取計算結(jié)果?
????????????????new?ReaderResult(calculator).start();?
????????????????new?ReaderResult(calculator).start();?
????????????????new?ReaderResult(calculator).start();?
????????????????//啟動計算線程?
????????????????calculator.start();?
????????}?
}

?

運行結(jié)果:

Thread[Thread-1,5,main]等待計算結(jié)果。。。?
Thread[Thread-2,5,main]等待計算結(jié)果。。。?
Thread[Thread-3,5,main]等待計算結(jié)果。。。?
Exception in thread?"Thread-0"?java.lang.IllegalMonitorStateException: current thread not owner?
??at java.lang.Object.notifyAll(Native Method)?
??at threadtest.Calculator.run(Calculator.java:18)?
Thread[Thread-1,5,main]計算結(jié)果為:5050?
Thread[Thread-2,5,main]計算結(jié)果為:5050?
Thread[Thread-3,5,main]計算結(jié)果為:5050?

Process finished with exit code 0?

?

運行結(jié)果表明,程序中有異常,并且多次運行結(jié)果可能有多種輸出結(jié)果。這就是說明,這個多線程的交互程序還存在問題。究竟是出了什么問題,需要深入的分析和思考,下面將做具體分析。

?

實際上,上面這個代碼中,我們期望的是讀取結(jié)果的線程在計算線程調(diào)用notifyAll()之前等待即可。 但是,如果計算線程先執(zhí)行,并在讀取結(jié)果線程等待之前調(diào)用了notify()方法,那么又會發(fā)生什么呢?這種情況是可能發(fā)生的。因為無法保證線程的不同部分將按照什么順序來執(zhí)行。幸運的是當(dāng)讀取線程運行時,它只能馬上進入等待狀態(tài)----它沒有做任何事情來檢查等待的事件是否已經(jīng)發(fā)生。? ----因此,如果計算線程已經(jīng)調(diào)用了notifyAll()方法,那么它就不會再次調(diào)用notifyAll(),----并且等待的讀取線程將永遠保持等待。這當(dāng)然是開發(fā)者所不愿意看到的問題。

?

因此,當(dāng)?shù)却氖录l(fā)生時,需要能夠檢查notifyAll()通知事件是否已經(jīng)發(fā)生。

?

通常,解決上面問題的最佳方式是將

?

?

?

轉(zhuǎn)載于:https://my.oschina.net/chendongj/blog/790170

總結(jié)

以上是生活随笔為你收集整理的线程交互的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品一区二区三区入口 | 美女扒开尿口来摸 | 狠狠操一区二区 | 日韩欧美性视频 | 日本欧美视频 | 国产一区二区三区麻豆 | 在线电影一区二区三区 | 亚洲天堂av一区二区 | 殴美一级黄色片 | 簧片av| 国产午夜精品视频 | 日韩人妻无码精品综合区 | 91嫩草在线 | 在线播放不卡av | 美女视频黄色 | 精品无码一区二区三区的天堂 | 成人h动漫精品一区二区器材 | 国产免费黄色大片 | 天天在线免费视频 | 色多多黄色| 九九热精品视频在线观看 | 鲁一鲁av | 四虎久久久 | 凹凸av在线 | 中文人妻熟女乱又乱精品 | 亚洲一区中文字幕在线观看 | 91原创视频| 欧美黄一级 | 日韩三区视频 | 日韩成人专区 | 精品123区 | 久久综合伊人 | 日韩精品一区二区三区四区 | 国产美女三级无套内谢 | 一二三毛片 | 香蕉视频毛片 | 丝袜一级片 | 亚洲精品无码久久久久久久 | 亚洲综合黄色 | 黑名单上的人全集免费观看 | 椎名空在线观看 | 欧美日本 | 国产亚洲综合精品 | 国产色婷婷 | 日韩r级电影在线观看 | 亚洲欧美日韩天堂 | 台湾swag在线播放 | a在线观看视频 | 超碰伊人| 天天爽天天色 | 精品网站999 | 日韩七区 | 午夜电影天堂 | 国产精品一区二区三区在线免费观看 | 久久99热精品 | 国产女无套免费视频 | 91调教打屁股xxxx网站 | 91av爱爱| 亚洲大色网 | 国产精品久久婷婷六月丁香 | 涩涩视频在线观看 | 丰满人妻一区二区三区大胸 | 黄色网址国产 | 美女被捅个不停 | 日韩五码在线 | 女性毛片 | 欧美成人视 | 国产日韩欧美视频 | 日批的视频 | 福利资源在线观看 | 日韩欧美亚洲精品 | 天天插av | 欧美一级片在线 | 欧美日韩国产一区二区三区 | 韩国三级视频在线 | 天天操网 | 久久亚洲精精品中文字幕早川悠里 | 白丝美女喷水 | 国产在线视频在线观看 | japanese av在线 | 国产激情综合五月久久 | 久久国产精品一区二区 | 黑帮大佬和我的三百六十五天 | 国产欧美一区二区在线 | 国产又粗又猛视频 | 亚洲欧美日韩国产一区二区三区 | 四虎永久在线 | 亚洲欧美日本韩国 | 少妇人妻真实偷人精品视频 | 波多野结衣在线看 | 一区二区激情 | 婷婷日| 亚洲4区| 少妇精品亚洲一区二区成人 | 日韩激情 | 欧美日韩一区二区三区四区五区六区 | 国产无毛片 | 国产成人免费电影 | 91久久国产综合久久91精品网站 |