java并发的艺术-读书笔记-第八章常用的并发工具类
jdk中提供了幾個非常有用的工具類,分別是CountDownLatch,CyclicBarrier和semaphore exchanger
CountDownLatch:允許一個或者多個線程等待其他線程完成操作
public class CountDownLatchTest{
static CountDownLatch c = new CountDownLatch(2);
public static void main(String[] args){
new Thread(new Runnable(){
System.out.println(1);
c.countDown();
System.out.println(2);
c.countDown();
}).start();
c.await();
System.out.println("3");
}
}
CountDownLatch的構造函數接收一個int 型的參數作為計數器,當你等待n個點就傳入n,當我們調用CountDownLatch的countdown方法時,n就會減一,CountDownLatch的await方法一直阻塞,直到n變成0,這里的n 指的是n個線程,或者是n個點,在用多線程時,只需要把countdownlatch傳入即可。
同步屏障CyclicBarrier
他要做的事情是讓一組線程達到一個屏障時被阻塞,直到最后一個線程達到一個屏障時,屏蔽才會開門,所有被屏蔽攔截的線程才能繼續運行
應用偽代碼:
public class CyclicBarrierTest{
static CyclicBarrier c=new ?CyclicBarrier(2);
public static void main(String[] args){
new Thread(
new Runnable(){
@overide
public void runnable(){
c.await();
System.out.println(1);
}
}
).start();
c.await();
System.out.printlN(2);
}
}
由于cpu分配時間片的不確定性,因此輸出的結果1,2 也可能是2,1
CycilcBarrier 提供了一個更高級的構造函數(int parties , Runnable runnable)
runnable 表示在達到了臨界點后優先執行runnable。
CycilcBarrier和coutdownlatch的區別
countdownlatch只能使用一次,cycilcBarrier可以使用多次,可以使用reset方法重置,所以cyclicbarrier能適用于更復雜的業務場景。例如計算錯誤,可以重置,并重新計算結果。
cyclicBarrier方法補充:getNumberWaiting 獲得阻塞線程數量
isbroken 阻塞線程時否被中斷
控制線程并發數 semaphore(信號量)
semaphore信號量用來控制同時訪問特定資源的線程數量。它通過協調各個線程,以保證合理的使用公共資源
應用場景:可以用作流量控制,特別是公共資源的有限場景比如數據庫連接,
public Class SemaphoreTest{
private static final int THREAD_COUNT=30;
private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(THREAD_COUNT);
private ?static Semaphore s = new Semaphore(20);
public static void main(String[] args){
threadPool.executor(new Runnable(){
public void runnable(){
s.acquire():
System.out.println("使用中。。。。。");
s.release();
}
}):
}
}
線程間交換數據exchanger
Exchanger 是一個線程間協作的工具類,exchanger用于進行線程間的數據交換,他提供一個交換點,在這個同步點,兩個線程可以交換彼此間的數據。這兩個線程通過exchange方法交換數據,如果第一個線程先執行exchange方法,它一直會等待第二個線程執行exchange方法,當兩個線程執行到交換點時,兩個線程將交換數據,將本線程產生的數據傳遞給對方
應用場景,主要用于兩個線程間對產生的數據進行校驗
轉載于:https://blog.51cto.com/5855156/1962507
總結
以上是生活随笔為你收集整理的java并发的艺术-读书笔记-第八章常用的并发工具类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 思科:四分之三的物联网项目将以失败告终
- 下一篇: js的parseInt() map()