欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么用Java高并發(fā)編程之CountDownLatch

本篇文章為大家展示了怎么用Java高并發(fā)編程之CountDownLatch,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對外擴(kuò)展宣傳的重要窗口,一個合格的網(wǎng)站不僅僅能為公司帶來巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺,成都創(chuàng)新互聯(lián)公司面向各種領(lǐng)域:發(fā)電機(jī)維修網(wǎng)站設(shè)計成都全網(wǎng)營銷推廣解決方案、網(wǎng)站設(shè)計等建站排名服務(wù)。


什么是CountDownLatch

CountDownLatch是通過一個計數(shù)器來實現(xiàn)的,計數(shù)器的初始值是線程的數(shù)量。每當(dāng)一個線程執(zhí)行完畢后,計數(shù)器的值就減1,當(dāng)計數(shù)器的值為0時,表示所有線程都執(zhí)行完畢,然后在閉鎖上(調(diào)用await方法的線程)等待的線程就可以恢復(fù)工作了。

應(yīng)用場景

CountDownLatch可以用來干什么呢?有什么應(yīng)用場景?實際項目中有應(yīng)用的場景嗎?這應(yīng)該才是大家比較關(guān)心的。我們先來看看官網(wǎng)提供的例子是如何進(jìn)行應(yīng)用的https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html  官方提供了兩個demo我直接把它轉(zhuǎn)成了圖片順帶推薦下這個代碼轉(zhuǎn)圖片的網(wǎng)址https://www.dute.org/code-snapshot  還挺好用的。

官網(wǎng)demo1

★The first is a start signal that prevents any worker from proceeding until  the driver is ready for them to proceed; The second is a completion signal that  allows the driver to wait until all workers have completed.”

  • 第一個開始信號(startSignal)會阻止任何工人(worker )開始工作,在司機(jī)到來之前。說白了就是司機(jī)沒來工人就不能干活。

  • 第二個是完成信號 (doneSignal),允許司機(jī) Driver 等待,直到所有的工人完成.說白了就是司機(jī)要等到所有工人完工為止。

  • 怎么用Java高并發(fā)編程之CountDownLatch

官網(wǎng)demo2

★Another typical usage would be to divide a problem into N parts, describe  each part with a Runnable that executes that portion and counts down on the  latch, and queue all the Runnables to an Executor. When all sub-parts are  complete, the coordinating thread will be able to pass through await.”

另一種典型的用法就是把一個大任務(wù)拆分N個部分,讓多個線程(Worker)執(zhí)行,每個線程(Worker)執(zhí)行完自己的部分計數(shù)器就減1,當(dāng)所有子部分都完成后,Driver  才繼續(xù)向下執(zhí)行才繼續(xù)執(zhí)行。就好比富士康手機(jī)加工的流水線一樣,組裝一步手機(jī)需要一條條的流水線來相互配合完成。一條條流水線(Worker),每條線都干自己的活。有的流水線是貼膜的,有的流水線是打螺絲的,有的流水線是質(zhì)檢的、有的流水線充電的、有的流水線貼膜的。等這些流水線都干完了就把一部手機(jī)組裝完成了。

怎么用Java高并發(fā)編程之CountDownLatch

上面兩個就是官方提供的demo,下面我再來兩個我們平時開發(fā)中可以用到的栗子:

多個線程等待:模擬并發(fā),讓并發(fā)線程一起執(zhí)行。

有時候我們寫了接口想去壓測下它,看看它的最大并發(fā)數(shù)大概是多少。當(dāng)然我們可以使用Jmeter來進(jìn)行壓測,但是有時候我們不想去下載工具,其實就可以借助CountDownLatch來實現(xiàn)。

/**  * @author: 公眾號:java金融  */ public class TestCountDownLatch2 {      public static void main(String[] args) throws InterruptedException {           CountDownLatch countDownLatch = new CountDownLatch(1);           for (int i = 0; i < 5; i++) {                new Thread(() -> {                     try {                          //所有請求都阻塞在這,等待                          countDownLatch.await();                          // 調(diào)用測試接口                          System.out.println(Thread.currentThread().getName() + "開始執(zhí)行&hellip;&hellip;");                     } catch (InterruptedException e) {                          e.printStackTrace();                     }                }).start();           }           // 讓請求都準(zhǔn)備好           Thread.sleep(2000);           // 讓所有請求統(tǒng)一請求           countDownLatch.countDown();      } }

我們通過CountDownLatch.await(),讓多個參與者線程啟動后阻塞等待,然后在主線程  調(diào)用CountDownLatch.countdown()  將計數(shù)減為0,讓所有線程一起往下執(zhí)行;以此實現(xiàn)了多個線程在同一時刻并發(fā)執(zhí)行,來模擬并發(fā)請求的目的。

單個線程等待:多個線程(任務(wù))完成后,進(jìn)行匯總合并

/**  * @author: 公眾號:java金融  */ public class TestCountDownLatch2 {      public static void main(String[] args) throws InterruptedException {           int count = 3;           CountDownLatch countDownLatch = new CountDownLatch(count);           for (int i = 0; i < count; i++) {                final int index = i;                new Thread(() -> {                     try {                          Thread.sleep(1000 + ThreadLocalRandom.current().nextInt(1000));                          System.out.println("finish" + index + Thread.currentThread().getName());                     } catch (InterruptedException e) {                          e.printStackTrace();                     }finally{                         countDownLatch.countDown();                     }                }).start();           }           countDownLatch.await();// 主線程在阻塞,當(dāng)計數(shù)器==0,就喚醒主線程往下執(zhí)行。           System.out.println("主線程:在所有任務(wù)運(yùn)行完成后,進(jìn)行結(jié)果匯總");      } }

這種場景應(yīng)該是用的最多了,比如我們打開一個電商的個人中心頁面,我們需要調(diào)用,用戶信息接口、用戶訂單接口、用戶會員信息等接口,然后合并后一起給到前端,假設(shè)每個接口最長耗時為1s,如果我們同步調(diào)用的話最大耗時時間是3s,如果我們采用異步調(diào)用然后合并結(jié)果,所以最大的耗時時間是3s。每個接口調(diào)用返回數(shù)據(jù)后調(diào)用countDown方法,讓計數(shù)器進(jìn)行減1,當(dāng)把計數(shù)器減為0時的這個線程會去喚醒主線程,讓它繼續(xù)往下走。

CountDownLatch 實現(xiàn)原理

CountDownLatch是通過AQS的state字段來實現(xiàn)的一個計數(shù)器,計數(shù)器的初始值(state的值)為new  CountDownLatch設(shè)置的數(shù)量,每次調(diào)用countDown的時候,state的值會進(jìn)行減1,最后某個線程將state值減為0時,會把調(diào)用了await()進(jìn)行阻塞等待的線程進(jìn)行喚醒。CountDownLatch重寫了tryReleaseShared這個方法,只有當(dāng)state這個字段被設(shè)置為0時,也就是tryReleaseShared返回true的情況就會執(zhí)行doReleaseShared方法,把調(diào)用了await的線程進(jìn)行喚醒。

public final boolean releaseShared(int arg) {       if (tryReleaseShared(arg)) {           doReleaseShared();           return true;       }       return false;   } rotected boolean tryReleaseShared(int releases) {           // Decrement count; signal when transition to zero           for (;;) {               int c = getState();               if (c == 0)                   return false;               int nextc = c-1;               if (compareAndSetState(c, nextc))                   return nextc == 0;           }       }

上述內(nèi)容就是怎么用Java高并發(fā)編程之CountDownLatch,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章題目:怎么用Java高并發(fā)編程之CountDownLatch
瀏覽地址:http://chinadenli.net/article28/ppgjcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗搜索引擎優(yōu)化、云服務(wù)器建站公司、服務(wù)器托管網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營