日韩性视频-久久久蜜桃-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永久| 正在播放木下凛凛xv99 | 中文字幕一区二区在线观看视频 | 黄色国产视频网站 | 欧美日韩a√ | 呦呦色 | 久久最新 | 国产精品女教师 | 国产欧美日韩精品一区二区三区 | 国产又黄又爽又色 | 嫩草影院懂你的影院 | 狠狠躁夜夜躁人人爽天天高潮 | 黄色三级网络 | 波多野结衣中文字幕一区二区三区 | 骑骑上司妻电影 | 三上悠亚一区二区在线观看 | 欧美国产日韩一区二区 | 日韩欧美国产一区二区 | 日韩黄色免费 | 日本韩国欧美一区 | 欧美一区欧美二区 | 亚洲欧美成人 | 成人欧美在线视频 | 亚洲啪视频 | 亚洲欧洲另类 | 国产黄色www | 日韩精品一区二区三区在线播放 | 在线视频日韩欧美 | 日日爽夜夜操 | 欧美操老女人 | 91视频免费播放 | 欧美熟妇精品一区二区 | 看黄色一级视频 | 奇米av在线| 久久一区二区视频 | 午夜视频在线免费 | 国产精品免费久久久久 | 国产日批视频在线观看 | 亚洲在线观看免费 | 国产农村妇女毛片精品久久 | 日韩小视频在线 | 成人免费在线观看 | 国产精品91在线 | 一级黄色毛毛片 | 色综合久久久久综合体桃花网 | 一级片一区二区三区 | 香蕉视频国产 | 欧美射射射 | 99久久综合 | 国产chinesehd精品露脸 | 国产美女精品人人做人人爽 | 精品91久久久久久 | 亚欧成人精品一区二区 | 337p嫩模大胆色肉噜噜噜 | 女人脱了内裤趴开腿让男躁 | 国产农村妇女精品 | 免费午夜视频 | 久久久久国产一区二区三区 | 亚洲精品女人 | 日韩欧美精品在线观看 | 国产1级片| 久久久无码精品亚洲国产 | 一区二区av在线 | 亚洲免费视频一区二区 | 精品一区二区三区无码按摩 | 欧美疯狂做受xxxxx高潮 | 无码日韩人妻精品久久蜜桃 | 18精品爽国产白嫩精品 | 男女无套免费视频网站动漫 | 久久精品久久久久久久 | 北京少妇xxxx做受 | 国产成人精品毛片 | 午夜影院在线播放 | 动漫精品一区 | 色老大影院 | 婷婷中文在线 | 成人av动漫在线观看 | 亚洲电影中文字幕 | 亚洲永久精品一区 | 亚洲第一视频在线观看 | 欧美日韩久久久 | 韩国裸体网站 | 亚洲av激情无码专区在线播放 | 久久久久a | 激情四射网站 | 中国老熟妇自拍hd发布 | 欧美日b片 | 免费一级肉体全黄毛片 | 久久av一区二区三区 | 欧美日韩在线观看视频 | 日韩国产精品一区二区 | 密臀av在线播放 | 中文字幕1页 | 91吃瓜今日吃瓜入口 | 国产精品久久久91 | 欧美黑丝少妇 | 国产又粗又猛又色又 | 一区二区三区在线视频观看 | 乱色专区 |