java常用併發工具介紹

2021-09-01 15:31:48 字數 3979 閱讀 4862

本文主要介紹的工具包括:

countdownlatch可以使乙個或多個執行緒等待一組事件發生。在countdownlatch內部維護乙個計數器(被初始化為乙個正整數),表示需要等待事件的數量。countdown()方法減少乙個事件數量,await()將等待直到計數器為零的時候,才繼續執行await後面的**。如果計數器不為零,那麼await將一直會阻塞等待直到計數器為零,或者阻賽執行緒中斷/超時。

@test

public void test() throws interruptedexception catch (interruptedexception ignore)

}}).start();

// sleep 0.5ms

timeunit.milliseconds.sleep(500);

}long starttime = system.currenttimemillis();

startevent.countdown();

// wait for all thread finish

finishevent.await();

system.out.println("total finish cost : " + (system.currenttimemillis() - starttime) + "ms");

}

這個例子展示了如何在同一時間啟動threadnum個執行緒,並且這threadnum個執行緒都完成後,記錄執行結果。startevent.await()將等待直到呼叫startevent.countdown()。這是,所有執行緒在同一時間啟動。當每個執行緒執行完畢的時候,會呼叫finishevent.countdown()通知給主線程,finishevent.await()將等待直到所有子執行緒都執行完畢。

列印結果:

thread[thread-1,5,main] start at : 1359782125125

thread[thread-8,5,main] start at : 1359782125125

thread[thread-7,5,main] start at : 1359782125125

thread[thread-6,5,main] start at : 1359782125125

thread[thread-5,5,main] start at : 1359782125125

thread[thread-3,5,main] start at : 1359782125125

thread[thread-0,5,main] start at : 1359782125125

thread[thread-2,5,main] start at : 1359782125125

thread[thread-4,5,main] start at : 1359782125125

total finish cost : 1ms

semaphore在內部持有乙個虛擬的許可組(初始化的時候可以設定虛擬組的數量),當執行某個操作的時候,呼叫acquire獲得許可,在操作執行完成後呼叫release釋放許可。如果沒有許可可用,那麼acquire方法會一直阻賽直到有許可可用為止,或者執行獲取許可的執行緒終端或阻賽。

semaphore可以用來控制某種資源的使用數量,或者同時使用特定資源的數量。利用這個特性,可以實現某種資源的資源池或者對容器實加邊界。

@test

public void test() throws interruptedexception catch (interruptedexception ignore) }}

}).start();

timeunit.seconds.sleep(1);

new thread(new runnable() catch (interruptedexception ignore) }}

}).start();

thread.currentthread().join();

}static class boundedlist

public boolean add(t o) throws interruptedexception finally }}

public boolean remove(t o)

return removed;

}}

這個例子展示了乙個帶邊界的list,當向集合中新增元素的時候,首先獲取許可。如果新增失敗了,那麼釋放許可。當刪除集合中的元素的時候,如果刪除成功,釋放乙個許可。這樣就能保證集合中的元素都是獲得許可後才新增進來的,從而保證了集合的邊界。

列印結果:

1359787233784 add 1

1359787233784 add 2

1359787233784 add 3

1359787233784 add 4

1359787233784 add 5

1359787234787 add 6

1359787234787 remove 1

1359787235288 remove 2

1359787235288 add 7

1359787235789 remove 3

1359787235789 add 8

1359787236290 remove 4

1359787236290 add 9

….

在這個例子中,生產者向集合中新增元素,消費者刪除元素,因為生產者的速度大於消費者,所以當集合中元素等於5的時候,就必須等待消費者刪除乙個元素後才能再繼續新增,從列印結果可以看出這點。

cyclicbarrier和countdownlatch有些類似,它阻塞一組執行緒直到某個事件發生。可以把cyclicbarrier理解成乙個障礙,當所有執行緒都到達這個"障礙"的時候,才能繼續下個事件。如果所有執行緒到達barrier處,barrier開啟釋放所有執行緒,並且barrier可以繼續使用。如果await方法超時,或者被中斷,那麼認為barrier被打破,所有在await上阻塞的執行緒都將丟擲brokenbarrierexception

@test

public void test() throws interruptedexception

});while (true) catch (interruptedexception e) catch (brokenbarrierexception e)

}});

}}

這個例子假設有一堆執行緒到達gate處,每當到達gate處的執行緒數達到gate_threshold時,gate開啟釋放這些執行緒並進入下次一次迴圈。

exchanger提供兩個執行緒以執行緒安全的形式交換資料,exchange等待另乙個執行緒到達exchange方法,然後把資料給另乙個執行緒並且接收另乙個執行緒交換過來的資料。

@test

public void test() throws interruptedexception catch (interruptedexception ignore)

}else catch (interruptedexception ignore) }}

}});

producer.start();

consumer.start();

producer.join();

consumer.join();

}

這個例子展示了乙個生產者/消費者的例子。當生產者填慢list後,等待交換。同樣當消費者消耗完list,也等待交換。

Java併發工具類

目錄 1.等待多執行緒完成的countdownlatch 2.同步屏障cyclicbarrier 3.控制併發執行緒數的semaphore 4.執行緒間交換資料的exchanger countdownlatch允許乙個或多個執行緒等待其他執行緒完成操作,類似於join方法。join的實現原理是不停的...

java中的併發工具類

類名稱類的簡介 類的特點 countdownlatch 允許乙個或者多個執行緒等待其他執行緒完成之後再執行後續操作 countdownlatch提供了乙個計數器,只能初始化一次,但是提供了乙個await方法,允許設定乙個時間,當等待一段時間後,就會不再阻塞當前執行緒。cyclicbarrier 讓一...

Java併發工具類之CyclicBarrier

cyclicbarrier的意思是可迴圈使用的屏障。它可以讓一組執行緒到達乙個屏障時被阻塞,直到最後乙個執行緒到達屏障時,屏障才會開門,所有阻塞的執行緒才會繼續執行。它就好像一道關卡,只有所有的部隊 執行緒 都到了才能放行。部分原始碼 public class cyclicbarrier 可以看到,...