您現在的位置是:首頁 > 網路遊戲首頁網路遊戲

是時候學一波Java併發工具類:Semaphore、Exchanger

簡介使用Semaphore可以控制同時訪問資源的執行緒個數,例如,實現一個檔案允許的併發訪問數

觸發小時級流控permits:5是什麼意思

是時候學一波Java併發工具類:Semaphore、Exchanger

前言

上篇文章我們聊關於Java併發類CountDownLatch、CyclicBarrier的文章。今天我們把餘下的內容再聊一聊。餘下的是什麼內容呢?

Java併發工具類常見的:Semaphore、Exchanger。

正文

1、控制併發執行緒數的Semaphore

1.1 作用

Semaphore(訊號量)是用來控制同時訪問特定資源的執行緒數量,它透過協調各個執行緒,以保證合理的使用公共資源。

1.2 簡介

Semaphore也是一個執行緒同步的輔助類,可以維護當前訪問自身的執行緒個數,並提供了同步機制。使用Semaphore可以控制同時訪問資源的執行緒個數,例如,實現一個檔案允許的併發訪問數。

1.3 應用場景

Semaphore可以用於做流量控制,特別公用資源有限的應用場景,比如資料庫連線。假如有一個需求,要讀取幾萬個檔案的資料,因為都是IO密集型任務,我們可以啟動幾十個執行緒併發的讀取,但是如果讀到記憶體後,還需要儲存到資料庫中,而資料庫的連線數只有10個,這時我們必須控制只有十個執行緒同時獲取資料庫連線儲存資料,否則會報錯無法獲取資料庫連線。這個時候,我們就可以使用Semaphore來做流控,程式碼如下:

是時候學一波Java併發工具類:Semaphore、Exchanger

在程式碼中,雖然有30個執行緒在執行,但是隻允許10個併發的執行。Semaphore的構造方法Semaphore(int permits) 接受一個整型的數字,表示可用的許可證數量。Semaphore(10)表示允許10個執行緒獲取許可證,也就是最大併發數是10。Semaphore的用法也很簡單,首先執行緒使用Semaphore的acquire()獲取一個許可證,使用完之後呼叫release()歸還許可證。還可以用tryAcquire()方法嘗試獲取許可證。

1.4 其他方法

Semaphore還提供一些其他方法:

是時候學一波Java併發工具類:Semaphore、Exchanger

2、執行緒間交換資料的Exchanger

Exchanger(交換者)是一個用於執行緒間協作的工具類。Exchanger用於進行執行緒間的資料交換。它提供一個同步點,在這個同步點兩個執行緒可以交換彼此的資料。這兩個執行緒透過exchange方法交換資料, 如果第一個執行緒先執行exchange方法,它會一直等待第二個執行緒也執行exchange,當兩個執行緒都到達同步點時,這兩個執行緒就可以交換資料,將本執行緒生產出來的資料傳遞給對方。

2。1、應用場景

1、Exchanger可以用於遺傳演算法,遺傳演算法裡需要選出兩個人作為交配物件,這時候會交換兩人的資料,並使用交叉規則得出2個交配結果。

2、Exchanger也可以用於校對工作。比如我們需要將紙製銀流透過人工的方式錄入成電子銀行流水,為了避免錯誤,採用AB崗兩人進行錄入,錄入到Excel之後,系統需要載入這兩個Excel,並對這兩個Excel資料進行校對,看看是否錄入的一致。程式碼如下:

是時候學一波Java併發工具類:Semaphore、Exchanger

執行結果:

在B中獲取到錄入的A是:銀行流水A

如果兩個執行緒有一個沒有到達exchange方法,則會一直等待,如果擔心有特殊情況發生,避免一直等待,可以使用exchange(V data, long time, TimeUnit unit)設定最大等待時長。

尾聲

關於Java併發工具類的基礎用法暫時到此就告一段落,希望各位小夥伴能夠有所收穫。

Top