日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CountDownLacth详解

發(fā)布時間:2023/12/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CountDownLacth详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  一個同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個或多個線程一直等待。

  用給定的計數(shù) 初始化 CounDownLatch。由于調(diào)用了countDown() 方法,所以在當(dāng)前計數(shù)到達(dá)零之前,await()方法會一直受阻塞。之后,會釋放所有等待的線程,await()的所有后續(xù)調(diào)用都將立即返回。這種現(xiàn)象只出現(xiàn)一次---計數(shù)無法被重置。如果需要重置計數(shù),請考慮使用CyclicBarrier。

  CountDownLatch 是一個通用同步工具,它有很多用途。將計數(shù) 1 初始化的 CountDownLatch 用作一個簡單的開/關(guān)鎖存器,或入口:在通過調(diào)用?countDown()的線程打開入口前,所有調(diào)用?await()的線程都一直在入口處等待。用 N 初始化的 CountDownLatch 可以使一個線程在 N 個線程完成某項操作之前一直等待,或者使其在某項操作完成 N 次之前一直等待。

  CountDownLatch 的一個有用特性是,它不要求調(diào)用 countDown 方法的線程等到計數(shù)到達(dá)零時才繼續(xù),而在所有線程都能通過之前,它只是阻止任何線程繼續(xù)通過一個await()。

  在接下來給出視頻會議的例子來說明CountDownLacth的用法,視頻會議需要等待多有的參與者都到會后才能開始。視頻會議:

public class VedioConference implements Runnable{private CountDownLatch countDownLatch;public VedioConference(int count) {this.countDownLatch = new CountDownLatch(count);}public void arrive(String name){System.out.println("參與者:"+name+"到達(dá)");countDownLatch.countDown();System.out.println("視頻會議還需要等待:"+countDownLatch.getCount()+"名參與者");}@Overridepublic void run() {try {System.out.println("視頻會議共有 :"+countDownLatch.getCount()+"名參與者");countDownLatch.await();System.out.println("所有參與者都已將到達(dá) ");System.out.println("開始會議...");} catch (InterruptedException e) {e.printStackTrace();}} }

  參與者:

public class Participant implements Runnable {private VedioConference conference;private String name;public Participant(VedioConference conference, String name) {this.conference = conference;this.name = name;}@Overridepublic void run() {try {//線程隨機(jī)休息一段時間Thread.currentThread().sleep((int)(Math.random()*10));} catch (InterruptedException e) {e.printStackTrace();}//調(diào)用arrive()表示參與者已經(jīng)到達(dá) conference.arrive(name);} }

測試類:

public class Main {public static void main(String[] args) {VedioConference conference=new VedioConference(5);Thread conThread=new Thread(conference);conThread.start();for (int i = 0; i <5; i++) {Participant participant=new Participant(conference, "participant"+i);Thread thread=new Thread(participant);thread.start();}} }

  運行結(jié)果:

視頻會議共有 :5名參與者 參與者:participant2到達(dá) 視頻會議還需要等待:4名參與者 參與者:participant3到達(dá) 視頻會議還需要等待:3名參與者 參與者:participant1到達(dá) 視頻會議還需要等待:2名參與者 參與者:participant4到達(dá) 視頻會議還需要等待:1名參與者 參與者:participant0到達(dá) 視頻會議還需要等待:0名參與者 所有參與者都已將到達(dá) 開始會議...

  內(nèi)存一致性效果:線程中調(diào)用 countDown() 之前的操作happen-before緊跟在從另一個線程中對應(yīng) await() 成功返回的操作。

總結(jié)

以上是生活随笔為你收集整理的CountDownLacth详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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