多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > Java并發學習之十七――線程同步工具之CountDownLatch

Java并發學習之十七――線程同步工具之CountDownLatch

來源:程序員人生   發布時間:2014-10-04 08:00:01 閱讀次數:2955次

本文是學習網絡上的文章時的總結,感謝大家無私的分享。

CountDownLatch的一個非常典型的應用場景是:有一個任務想要往下執行,但必須要等到其他的任務執行完畢后才可以繼續往下執行。假如我們這個想要繼續往下執行的任務調用一個CountDownLatch對象的await()方法,其他的任務執行完自己的任務后調用同一個CountDownLatch對象上的countDown()方法,這個調用await()方法的任務將一直阻塞等待,直到這個CountDownLatch對象的計數值減到0為止。

package chapter3; import java.util.concurrent.CountDownLatch; public class Videoconference implements Runnable{ private final CountDownLatch controller; public Videoconference(int number){ controller = new CountDownLatch(number); } public void arrive(String name){ System.out.println(name+" has arrived."); controller.countDown(); System.out.println("VideoConference:Waiting for "+controller.getCount()); } @Override public void run() { System.out.println("VideoConference:Initialization:"+controller.getCount()); try { controller.await(); System.out.printf("VideoConference: All the participants have come "); System.out.printf("VideoConference: Let's start... "); } catch (InterruptedException e) { e.printStackTrace(); } } }

package chapter3; import java.util.concurrent.TimeUnit; public class Participant implements Runnable{ private Videoconference conference; private String name; public Participant(Videoconference conference,String name){ this.conference = conference; this.name = name; } @Override public void run() { long duration = (long)(Math.random()*10); try { TimeUnit.SECONDS.sleep(duration); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } conference.arrive(name); } }

package chapter3; /** * * <p> * Description: CountDownLatch的學習 * </p> * @author zhangjunshuai * @version 1.0 * Create Date: 2014-9-25 下午8:11:55 * Project Name: Java7Thread * * <pre> * Modification History: * Date Author Version Description * ----------------------------------------------------------------------------------------------------------- * LastChange: $Date:: $ $Author: $ $Rev: $ * </pre> * */ public class Main2 { /** * <p> * </p> * @author zhangjunshuai * @date 2014-9-25 下午8:11:50 * @param args */ public static void main(String[] args) { Videoconference conference = new Videoconference(9); Thread threadConference = new Thread(conference); threadConference.start(); for(int i=0;i<10;i++){ Participant p = new Participant(conference, "Participant"+i); Thread t = new Thread(p); t.start(); } } }

CountDownLatch類有3個基本元素:

  1. 初始值決定CountDownLatch類需要等待的事件的數量。
  2. await() 方法, 被等待全部事件終結的線程調用。
  3. countDown() 方法,事件在結束執行后調用。

當創建 CountDownLatch 對象時,對象使用構造函數的參數來初始化內部計數器。每次調用 countDown() 方法, CountDownLatch 對象內部計數器減一。當內部計數器達到0時, CountDownLatch 對象喚醒全部使用 await() 方法睡眠的線程們。

不可能重新初始化或者修改CountDownLatch對象的內部計數器的值。一旦計數器的值初始后,唯一可以修改它的方法就是之前用的 countDown() 方法。當計數器到達0時, 全部調用 await() 方法會立刻返回,接下來任何countDown() 方法的調用都將不會造成任何影響。

此方法與其他同步方法有這些不同:

CountDownLatch 機制不是用來保護共享資源或者臨界區。它是用來同步一個或者多個執行多個任務的線程。它只能使用一次。像之前解說的,一旦CountDownLatch的計數器到達0,任何對它的方法的調用都是無效的。如果你想再次同步,你必須創建新的對象。

CountDownLatch 類有另一種版本的 await() 方法,它是:

  • await(long time, TimeUnit unit): 此方法會休眠直到被中斷; CountDownLatch 內部計數器到達0或者特定的時間過去了。TimeUnit 類包含了:DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS, 和 SECONDS.

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲国产成人91精品 | 天堂黄色| 欧美日韩亚洲一区 | 欧美日韩午夜精品不卡综合 | 日韩在线a视频免费播放 | 亚洲有码区| 日本一区二区在线视频 | 日本aaaaa级毛片片 | 国产成人精品一区二区三区 | 欧美激情观看一区二区久久 | 羞羞影院男女午夜爽爽影视 | 最近最新免费中文字幕一 | 日本精高清区一 | 亚洲精品久久久久网站 | ww亚洲ww亚在线观看 | 福利视频一二三在线视频免费观看 | 91精品福利在线观看 | 天天天做天天天天爱天天想 | 欧美性猛交xxxxx按摩欧美 | 欧美俄罗斯一级毛片激情 | 欧美日韩国产一区二区三区 | 国产综合久久一区二区三区 | 中文字幕在线观看一区 | 成人在激情在线视频 | 亚洲欧美小说 | 羞羞动漫在线免费观看 | 韩国午夜理伦三级2020宅男 | 欧美又粗又硬又黄又爽视频 | 日本免费人做人一区在线观看 | 女人18一级特级毛片免费看 | 波多野结衣免费在线视频 | 亚洲精品一区二区三区在 | 伊人影院99 | 久久不射网 | 欧美vido| 大陆三级午夜理伦三级三 | 日产一区二区三区四区 | 久久男人精品 | 一级a毛片免费观看久久精品 | 性性影院在线观看 | 欧美人与性另类 |