成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java 多線程編程核心技術(shù) 3—線程間通信

Dogee / 2904人閱讀

摘要:在從返回前,線程與其他線程競爭重新獲得鎖。就緒隊(duì)列存儲(chǔ)了將要獲得鎖的線程,阻塞隊(duì)列存儲(chǔ)了被阻塞的線程。當(dāng)線程呈狀態(tài),調(diào)用線程對(duì)象的方法會(huì)出現(xiàn)異常。在執(zhí)行同步代碼塊過程中,遇到異常而導(dǎo)致線程終止,鎖也會(huì)被釋放。

方法wait()的作用是使當(dāng)前執(zhí)行代碼的線程進(jìn)行等待,wait()方法是Object類的方法,該方法用來將當(dāng)前線程置入"預(yù)執(zhí)行隊(duì)列"中,并且在wait()所在的代碼行處停止執(zhí)行,直到接到通知或被中斷。

在調(diào)用wait()之前,線程必須獲得該對(duì)象級(jí)別鎖,即只能在同步方法或者同步代碼塊中調(diào)用wait()方法。

在執(zhí)行wait()方法后,當(dāng)前線程釋放鎖。在從wait()返回前,線程與其他線程競爭重新獲得鎖。

如果調(diào)用wait()時(shí)沒有持有適當(dāng)?shù)逆i,則拋出IllegalMonitorStateException,它是RuntimeException的一個(gè)子類,因此,不需要try-catch語句進(jìn)行捕捉異常。

方法notify()也要在同步方法或同步塊中調(diào)用,即在調(diào)用前,線程也必須獲得該對(duì)象的對(duì)象級(jí)別。

如果有多個(gè)線程等待,則由線程規(guī)劃器隨機(jī)挑選出其中一個(gè)呈wait狀態(tài)的線程,對(duì)其發(fā)出通知notify,并使它等待獲取該對(duì)象的對(duì)象鎖。

在執(zhí)行notify()方法后,當(dāng)前線程不會(huì)馬上釋放該對(duì)象鎖,呈wait狀態(tài)的線程也并不能馬上獲取該對(duì)象鎖,要等到執(zhí)行notify()方法的線程將程序執(zhí)行完,也就是退出synchronized代碼塊后,當(dāng)前線程才釋放鎖,而呈wait狀態(tài)所在的線程才可以獲取該對(duì)象鎖。

這也說明notify()方法執(zhí)行后并不立即釋放鎖。

通過調(diào)用wait()方法可以使處于臨界區(qū)的線程進(jìn)入等待狀態(tài),同時(shí)釋放被同步對(duì)象的鎖。而notify操作可以喚醒一個(gè)因調(diào)用了wait操作而處于阻塞狀態(tài)中的線程,使其進(jìn)入就緒狀態(tài)。

wait()方法可以使調(diào)用該方法的線程釋放共享資源的鎖,然后從運(yùn)行狀態(tài)退出,進(jìn)入等待隊(duì)列,直到被再次喚醒。

notify()方法可以隨機(jī)喚醒等待隊(duì)列中等待統(tǒng)一共享資源的“一個(gè)”線程,并使該線程退出等待隊(duì)列,進(jìn)入可運(yùn)行狀態(tài),也就是notify()方法僅通知“一個(gè)”線程。

notifyAll()方法可以使所有正在等待隊(duì)列中等待同一個(gè)共享資源的“全部”線程從等待狀態(tài)退出,進(jìn)入可運(yùn)行狀態(tài)。

每個(gè)鎖對(duì)象都有兩個(gè)隊(duì)列,一個(gè)是就緒隊(duì)列,一個(gè)阻塞隊(duì)列。就緒隊(duì)列存儲(chǔ)了將要獲得鎖的線程,阻塞隊(duì)列存儲(chǔ)了被阻塞的線程。一個(gè)線程被喚醒后,才會(huì)進(jìn)入就緒隊(duì)列,等待CPU的調(diào)度;反之,一個(gè)線程被wait后,就會(huì)進(jìn)入阻塞隊(duì)列,等待下一次被喚醒。

當(dāng)方法wait()被執(zhí)行后,鎖被自動(dòng)釋放,但執(zhí)行完notify()方法,鎖卻不自動(dòng)釋放。

必須執(zhí)行完notify()方法所在的同步synchronized代碼塊后才釋放鎖。

當(dāng)線程呈wait()狀態(tài),調(diào)用線程對(duì)象的interrupt()方法會(huì)出現(xiàn)InterruptedException異常。

執(zhí)行同步代碼塊就會(huì)釋放對(duì)象的鎖。在執(zhí)行同步代碼塊過程中,遇到異常而導(dǎo)致線程終止,鎖也會(huì)被釋放。

在執(zhí)行同步代碼塊的過程中,執(zhí)行了鎖所屬對(duì)象的wait()方法,這個(gè)線程會(huì)釋放對(duì)象鎖,而此線程對(duì)象會(huì)進(jìn)入線程等待池中,等待被喚醒。

調(diào)用方法notify()一次只隨機(jī)通知一個(gè)線程進(jìn)行喚醒。

為了喚醒全部線程,可以使用notifyAll()方法。

帶一個(gè)參數(shù)的wait(long)方法的功能是等待某一時(shí)間內(nèi)是否有線程對(duì)鎖進(jìn)行喚醒,如果超過這個(gè)時(shí)間則自動(dòng)喚醒。

管道流(pipeStream)是一種特殊的流,用于在不同線程間直接傳送數(shù)據(jù)。一個(gè)線程發(fā)送數(shù)據(jù)到輸出管道,另一個(gè)線程從輸入管道中讀數(shù)據(jù)。通過使用管道,實(shí)現(xiàn)不同線程間的通信,而無須借助于類似于臨時(shí)文件之類的東西。

方法join()的作用是等待線程對(duì)象銷毀。

方法join的作用所屬的線程對(duì)象x正常執(zhí)行run()方法中的任務(wù),而使當(dāng)前線程z進(jìn)行無限期的阻塞,等待線程x銷毀后再繼續(xù)執(zhí)行線程z后面的代碼。

join與synchronized的區(qū)別是:join在內(nèi)部使用wait()方法進(jìn)行等待,而synchronized關(guān)鍵字使用的是“對(duì)象監(jiān)視器”原理做為同步。

join()與interrupt()方法如果彼此相遇,則會(huì)出現(xiàn)異常。

方法join(long)中的參數(shù)是設(shè)定等待的時(shí)間。

方法join(long)的功能在內(nèi)部使用wait(long)方法來實(shí)現(xiàn)的,所以join(long)方法具有釋放鎖的特點(diǎn)。

當(dāng)執(zhí)行wait(long)方法后,當(dāng)前線程的鎖被釋放,那么其他線程就可以調(diào)用此線程中的同步方法了。

Thread.sleep(long)方法卻不釋放鎖。

變量值的共享可以使用public static 變量的形式,所有的線程都使用一個(gè)public static變量。

類ThreadLocal主要解決的就是每個(gè)線程綁定自己的值,可以將ThreadLocal類比喻成全局存放數(shù)據(jù)的盒子,盒子中可以存儲(chǔ)每個(gè)線程的私有數(shù)據(jù)。

類ThreadLocal解決的是變量在不同線程間的隔離性,也就是不同線程擁有自己的值,不同的線程中的值是可以放入ThreadLocal類中進(jìn)行保存的。在第一次調(diào)用ThreadLocal類的get()方法返回是null,解決辦法是繼承ThreadLocal類重寫initialValue()方法。

使用InheritableThreadLocal可以在子線程中取得父線程繼承下來的值。如果子線程在取得值的同時(shí),主線程將InheritableThreadLocal中的值進(jìn)行更改,那么子線程取得的值還是舊值。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68186.html

相關(guān)文章

  • Java線程學(xué)習(xí)(五)線程通信知識(shí)點(diǎn)補(bǔ)充

    摘要:我們通過之前幾章的學(xué)習(xí)已經(jīng)知道在線程間通信用到的關(guān)鍵字關(guān)鍵字以及等待通知機(jī)制。今天我們就來講一下線程間通信的其他知識(shí)點(diǎn)管道輸入輸出流的使用的使用。將當(dāng)前線程的此線程局部變量的副本設(shè)置為指定的值刪除此線程局部變量的當(dāng)前線程的值。 系列文章傳送門: Java多線程學(xué)習(xí)(一)Java多線程入門 Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線程學(xué)習(xí)(二)synchr...

    mating 評(píng)論0 收藏0
  • 深入理解 Java 線程系列(1)——一個(gè)簡單需求的并行改造 & Java線程通信問題

    摘要:所以接下來,我們需要簡單的介紹下多線程中的并發(fā)通信模型。比如中,以及各種鎖機(jī)制,均為了解決線程間公共狀態(tài)的串行訪問問題。 并發(fā)的學(xué)習(xí)門檻較高,相較單純的羅列并發(fā)編程 API 的枯燥被動(dòng)學(xué)習(xí)方式,本系列文章試圖用一個(gè)簡單的栗子,一步步結(jié)合并發(fā)編程的相關(guān)知識(shí)分析舊有實(shí)現(xiàn)的不足,再實(shí)現(xiàn)邏輯進(jìn)行分析改進(jìn),試圖展示例子背后的并發(fā)工具與實(shí)現(xiàn)原理。 本文是本系列的第一篇文章,提出了一個(gè)簡單的業(yè)務(wù)場景...

    ruicbAndroid 評(píng)論0 收藏0
  • Java 線程核心技術(shù)梳理(附源碼)

    摘要:本文對(duì)多線程基礎(chǔ)知識(shí)進(jìn)行梳理,主要包括多線程的基本使用,對(duì)象及變量的并發(fā)訪問,線程間通信,的使用,定時(shí)器,單例模式,以及線程狀態(tài)與線程組。源碼采用構(gòu)建,多線程這部分源碼位于模塊中。通知可能等待該對(duì)象的對(duì)象鎖的其他線程。 本文對(duì)多線程基礎(chǔ)知識(shí)進(jìn)行梳理,主要包括多線程的基本使用,對(duì)象及變量的并發(fā)訪問,線程間通信,lock的使用,定時(shí)器,單例模式,以及線程狀態(tài)與線程組。 寫在前面 花了一周時(shí)...

    Winer 評(píng)論0 收藏0
  • Java? 教程(進(jìn)程和線程

    并發(fā) 計(jì)算機(jī)用戶想當(dāng)然地認(rèn)為他們的系統(tǒng)一次可以做不止一件事,他們設(shè)想他們可以繼續(xù)在文字處理器中工作,而其他應(yīng)用程序則下載文件、管理打印隊(duì)列和流音頻,即使是單個(gè)應(yīng)用程序通常也希望一次完成多個(gè)任務(wù)。例如,流式音頻應(yīng)用程序必須同時(shí)從網(wǎng)絡(luò)上讀取數(shù)字音頻、解壓縮、管理回放并更新其顯示,甚至文字處理器應(yīng)始終準(zhǔn)備好響應(yīng)鍵盤和鼠標(biāo)事件,無論重新格式化文本或更新顯示有多繁忙,可以執(zhí)行此類操作的軟件稱為并發(fā)軟件。 J...

    AZmake 評(píng)論0 收藏0
  • 計(jì)算機(jī)常識(shí) - 收藏集 - 掘金

    摘要:使用簡記后端掘金全稱為即消息隊(duì)列。優(yōu)測優(yōu)社區(qū)干貨精選老司機(jī)亂談編輯器之神掘金前言是一種信仰,我自從年有了這個(gè)信仰,已經(jīng)個(gè)年頭了。 PHP 程序員進(jìn)階學(xué)習(xí)書籍參考指南 - 后端 - 掘金PHP程序員進(jìn)階學(xué)習(xí)書籍參考指南 @heiyeluren lastmodify: 2016/2/18 ... 當(dāng)我們在談?wù)撉岸思用軙r(shí),我們在談些什么 - 前端 - 掘金潘建旭,豈安科技(www.bigse...

    Yi_Zhi_Yu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Dogee

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<