国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java 多線程編程核心技術 3—線程間通信

Dogee / 2897人閱讀

摘要:在從返回前,線程與其他線程競爭重新獲得鎖。就緒隊列存儲了將要獲得鎖的線程,阻塞隊列存儲了被阻塞的線程。當線程呈狀態,調用線程對象的方法會出現異常。在執行同步代碼塊過程中,遇到異常而導致線程終止,鎖也會被釋放。

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

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

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

如果調用wait()時沒有持有適當的鎖,則拋出IllegalMonitorStateException,它是RuntimeException的一個子類,因此,不需要try-catch語句進行捕捉異常。

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

如果有多個線程等待,則由線程規劃器隨機挑選出其中一個呈wait狀態的線程,對其發出通知notify,并使它等待獲取該對象的對象鎖。

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

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

通過調用wait()方法可以使處于臨界區的線程進入等待狀態,同時釋放被同步對象的鎖。而notify操作可以喚醒一個因調用了wait操作而處于阻塞狀態中的線程,使其進入就緒狀態。

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

notify()方法可以隨機喚醒等待隊列中等待統一共享資源的“一個”線程,并使該線程退出等待隊列,進入可運行狀態,也就是notify()方法僅通知“一個”線程。

notifyAll()方法可以使所有正在等待隊列中等待同一個共享資源的“全部”線程從等待狀態退出,進入可運行狀態。

每個鎖對象都有兩個隊列,一個是就緒隊列,一個阻塞隊列。就緒隊列存儲了將要獲得鎖的線程,阻塞隊列存儲了被阻塞的線程。一個線程被喚醒后,才會進入就緒隊列,等待CPU的調度;反之,一個線程被wait后,就會進入阻塞隊列,等待下一次被喚醒。

當方法wait()被執行后,鎖被自動釋放,但執行完notify()方法,鎖卻不自動釋放。

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

當線程呈wait()狀態,調用線程對象的interrupt()方法會出現InterruptedException異常。

執行同步代碼塊就會釋放對象的鎖。在執行同步代碼塊過程中,遇到異常而導致線程終止,鎖也會被釋放。

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

調用方法notify()一次只隨機通知一個線程進行喚醒。

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

帶一個參數的wait(long)方法的功能是等待某一時間內是否有線程對鎖進行喚醒,如果超過這個時間則自動喚醒。

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

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

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

join與synchronized的區別是:join在內部使用wait()方法進行等待,而synchronized關鍵字使用的是“對象監視器”原理做為同步。

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

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

方法join(long)的功能在內部使用wait(long)方法來實現的,所以join(long)方法具有釋放鎖的特點。

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

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

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

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

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68186.html

相關文章

  • Java線程學習(五)線程通信知識點補充

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

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

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

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

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

    Winer 評論0 收藏0
  • Java? 教程(進程和線程

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

    AZmake 評論0 收藏0
  • 計算機常識 - 收藏集 - 掘金

    摘要:使用簡記后端掘金全稱為即消息隊列。優測優社區干貨精選老司機亂談編輯器之神掘金前言是一種信仰,我自從年有了這個信仰,已經個年頭了。 PHP 程序員進階學習書籍參考指南 - 后端 - 掘金PHP程序員進階學習書籍參考指南 @heiyeluren lastmodify: 2016/2/18 ... 當我們在談論前端加密時,我們在談些什么 - 前端 - 掘金潘建旭,豈安科技(www.bigse...

    Yi_Zhi_Yu 評論0 收藏0

發表評論

0條評論

Dogee

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<