1. 程式人生 > >JDK並發工具類

JDK並發工具類

就會 read 大並發 part 指定 info ima 有用 div

在JDK的並發包裏提供了幾個非常有用的並發工具類。CountDownLatch、CyclicBarrier和Semaphore工具類提供了一種並發流程控制的手段,Exchanger工具類則提供了在線程間交換數據的一種手段。 1等待多線程完成的CountDownLatch CountDownLatch:CountDownLatch允許一個或多個線程等待其他線程完成操作。與thread.join方法類似但功能更多。該計數器只能使用一次 技術分享圖片

技術分享圖片 CountDownLatch的構造函數接收一個int類型的參數作為計數器,如果你想等待N個點完成,這裏就傳入N。當我們調用CountDownLatch的countDown方法時,N就會減1,CountDownLatch的await方法 會阻塞當前線程,直到N變成零。由於countDown方法可以用在任何地方,所以這裏說的N個點,可以是N個線程,也可以是1個線程裏的N個執行步驟。用在多個線程時,只需要把這個CountDownLatch的引用傳遞到線程裏即可。 如果有某個解析sheet的線程處理得比較慢,我們不可能讓主線程一直等待,所以可以使用另外一個帶指定時間的await方法——await(long time,TimeUnit unit),這個方法等待特定時間後,就會不再阻塞當前線程。join也有類似的方法。 2同步屏障CyclicBarrier 讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最後一個線程到達屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續運行。該計數器可以使用reset()方法重置 技術分享圖片

技術分享圖片 CyclicBarrier默認的構造方法是CyclicBarrier(int parties),其參數表示屏障攔截的線程數量,每個線程調用await方法告訴CyclicBarrier我已經到達了屏障,然後當前線程被阻塞 如果把new CyclicBarrier(2)修改成new CyclicBarrier(3),則主線程和子線程會永遠等待,因為沒有第三個線程執行await方法,即沒有第三個線程到達屏障,所以之前到達屏障的兩個線程都不會繼續執行。 CyclicBarrier還提供一個更高級的構造函數CyclicBarrier(int parties,Runnable barrier-Action),用於在線程到達屏障時,優先執行barrierAction,方便處理更復雜的業務場景,比如匯總excel中多個sheet頁內容 技術分享圖片

技術分享圖片 3.控制並發線程數的Semaphore 用來控制同時訪問特定資源的線程數量 技術分享圖片

技術分享圖片 Semaphore(10)表示允許10個線程獲取許可證,也就是最大並發數是10。Semaphore的用法也很簡單,首先線程使用Semaphore的acquire()方法獲取一個許可證,使用完之後調用release()方法歸還許可證 4.線程間交換數據的Exchanger Exchanger(交換者)是一個用於線程間協作的工具類。Exchanger用於進行線程間的數據交換。它提供一個同步點,在這個同步點,兩個線程可以交換彼此的數據。這兩個線程通過exchange方法交換數據,如果第一個線程先執行exchange()方法,它會一直等待第二個線程也執行exchange方法,當兩個線程都到達同步點時,這兩個線程就可以交換數據,將本線程生產出來的數據傳遞給對方。

JDK並發工具類