您現在的位置是:首頁 > 網路遊戲首頁網路遊戲
一文理解java執行緒間協作問題的工具類Exchanger
- 2022-09-21
執行緒之間如何進行通訊
在很久之前我曾寫過一篇一篇文章介紹執行緒間如何進行通訊的問題,當時使用的是等待通知模型,這篇文章介紹一個java提供的用於兩個執行緒間通訊的工具類Exchanger。
一、概念理解
Exchanger的作用就是為了兩個執行緒之間交換資料,他提供了一個內部方法exchange,這個內部方法就好比是一個同步點,只有兩個方法都到達同步點,才可以交換資料。我們換一張圖來演示一波。
也就是說只有執行緒A和執行緒B都到達同步點,才可以交換資料。
我們上程式碼直接看看如何使用,然後再去看看使用的時候需要注意什麼。
二、使用案例
1、基本使用
首先我們定義一個測試類ExchangerTest:
在這個類中,我們使用了ThreadA和ThreadB兩個執行緒交換資料,然後我們定義了一個交換器Exchanger來交換。下面我們看看這倆執行緒是如何實現的。
在這裡我們主要是看run方法的實現,首先我們打印出交換之前的資料資訊,然後使用交換器交換資料,最後再打印出交換之後的資料。由於ThreadB和ThreadA實現方式一樣,在這裡我們只給出一份程式碼即可。下面我們就可以執行一下,看看測試結果:
現在我們看到,執行緒A和執行緒B就可以正常地進行交換了。透過這個案例我們會發現,Exchanger使用起來真的是超級簡單。不過看起來很簡單,其實還挖了很多的坑,下面我們來看看。
注意點一:兩個執行緒最終必須到達同步點
這是什麼意思呢?我們畫一張圖,舉一個例子。
上面這張圖的意思是這個樣子的,左邊的執行緒還有20秒才可以到達同步點,但是右邊的執行緒設定了超時時間,如果10秒鐘後對方沒有到達,那麼這次交易就宣告失敗。對於我們的程式來說也會出現異常。我們程式碼演示一下:
首先這次我們看右邊的執行緒A:設定了超時時間為10秒
然後就是左邊的執行緒B:還需要20秒才可以抵達
現在我們再去測試一下看看會出現什麼結果:
我們發現執行緒A等待了10秒之後,執行緒B還沒有到達,那就宣告交易失敗。程式出現超時異常。
注意點二:交換的執行緒必須成對出現
這個注意點是什麼意思呢?其實就是不能是單,就好比是找物件,最後總是成雙成對的,要是5個男的4個女的,那剩下的一個男同胞怎麼辦,只能在那傻等了。這個我們也可以程式碼測試一下,只是新增了一個執行緒C。測試程式碼變一下:
此時我們再去測試,就會發現,總有一個執行緒處於死迴圈一直等待的狀態。
注意點三:多個執行緒交換資料
上面我們提到了交換的執行緒配對之後不能落單,那麼如果此時有多個成對的執行緒了,誰和誰配對呢?答案我們先告訴你,那就是胡亂配對。
在這裡我們在注意點二的基礎之上繼續增加一個執行緒D,然後繼續更改我們的測試類執行一下:
對於Exchanger的使用基本上需要注意的就是這麼多。希望對你有幫助。