日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

java并发的艺术-读书笔记-第八章常用的并发工具类

發(fā)布時間:2025/4/16 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java并发的艺术-读书笔记-第八章常用的并发工具类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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的構(gòu)造函數(shù)接收一個int 型的參數(shù)作為計數(shù)器,當(dāng)你等待n個點就傳入n,當(dāng)我們調(diào)用CountDownLatch的countdown方法時,n就會減一,CountDownLatch的await方法一直阻塞,直到n變成0,這里的n 指的是n個線程,或者是n個點,在用多線程時,只需要把countdownlatch傳入即可。

同步屏障CyclicBarrier

他要做的事情是讓一組線程達到一個屏障時被阻塞,直到最后一個線程達到一個屏障時,屏蔽才會開門,所有被屏蔽攔截的線程才能繼續(xù)運行

應(yīng)用偽代碼:

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分配時間片的不確定性,因此輸出的結(jié)果1,2 也可能是2,1

CycilcBarrier 提供了一個更高級的構(gòu)造函數(shù)(int parties , Runnable runnable)

runnable 表示在達到了臨界點后優(yōu)先執(zhí)行runnable。

CycilcBarrier和coutdownlatch的區(qū)別

countdownlatch只能使用一次,cycilcBarrier可以使用多次,可以使用reset方法重置,所以cyclicbarrier能適用于更復(fù)雜的業(yè)務(wù)場景。例如計算錯誤,可以重置,并重新計算結(jié)果。

cyclicBarrier方法補充:getNumberWaiting 獲得阻塞線程數(shù)量

isbroken 阻塞線程時否被中斷

控制線程并發(fā)數(shù) semaphore(信號量)

semaphore信號量用來控制同時訪問特定資源的線程數(shù)量。它通過協(xié)調(diào)各個線程,以保證合理的使用公共資源

應(yīng)用場景:可以用作流量控制,特別是公共資源的有限場景比如數(shù)據(jù)庫連接,

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();

}

}):

}

}

線程間交換數(shù)據(jù)exchanger

Exchanger 是一個線程間協(xié)作的工具類,exchanger用于進行線程間的數(shù)據(jù)交換,他提供一個交換點,在這個同步點,兩個線程可以交換彼此間的數(shù)據(jù)。這兩個線程通過exchange方法交換數(shù)據(jù),如果第一個線程先執(zhí)行exchange方法,它一直會等待第二個線程執(zhí)行exchange方法,當(dāng)兩個線程執(zhí)行到交換點時,兩個線程將交換數(shù)據(jù),將本線程產(chǎn)生的數(shù)據(jù)傳遞給對方

應(yīng)用場景,主要用于兩個線程間對產(chǎn)生的數(shù)據(jù)進行校驗


轉(zhuǎn)載于:https://blog.51cto.com/5855156/1962507

總結(jié)

以上是生活随笔為你收集整理的java并发的艺术-读书笔记-第八章常用的并发工具类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。