CountDownLatch

CountDownLatch用来同步一个或多个 任务,强制他们等待由其他任务执行的一组操作完成。

用法:

给CountDownLatch对象设置一个初值,任何在这个对象上调用await()的方法都将阻塞,等待这个计数值为0,

可以由其他线程在这个对象调用countDown()来减少这个计数值,计数值不能被重置。

countDown()不会造成阻塞。

示例:

/**
 * 完成初始化工作的对象
 */
class TaskPortion implements Runnable{
    private static int counter=0;
    private final int id=counter++;
    private static Random rand=new Random(47);
    private final CountDownLatch latch;
    TaskPortion(CountDownLatch latch){
        this.latch=latch;
    }
    @Override
    public void run() {
        try {
            doWork();
            latch.countDown();//减少计数值
        } catch (InterruptedException e) {

        }
    }
    public void doWork() throws InterruptedException{
        TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000));//随机等待一段时间,模拟任务进行
        System.out.println(this+"completed");
    }
    public String toString(){
        return String.format("%1$-3d ",id);
    }
}

/**
 * 等待任务,必须等所有初始化任务完成之后才可以进行
 */
class WaitingTask implements Runnable{
    private static int counter=0;
    private final int id=counter++;
    private final CountDownLatch latch;
    WaitingTask(CountDownLatch latch){
        this.latch=latch;
    }

    @Override
    public void run() {
        try {
            latch.await();//使当前任务等待,直到计数值为0
            System.out.println("Latch barrier passed for "+this);
        } catch (InterruptedException e) {
            System.out.println(this+" interrupted");
        }
    }
    public String toString(){
        return String.format("WaitingTask %1$-3d",id);
    }
}
public class CountDownLatchDemo {
    static final int SIZE=100;
    public static void main(String[] args) throws Exception{
        ExecutorService exec= Executors.newCachedThreadPool();
        CountDownLatch latch=new CountDownLatch(SIZE);//初始化计数值为100
        for(int i=0;i<10;i++)
            exec.execute(new WaitingTask(latch));//10个等待任务
        for(int i=0;i<SIZE;i++)
            exec.execute(new TaskPortion(latch));//100个初始化任务
        System.out.println("Launched all tasks");
        exec.shutdown();
    }
}
Launched all tasks
43  completed
98  completed
37  completed
96  completed
94  completed
11  completed
21  completed
77  completed
6   completed
9   completed
75  completed
79  completed
10  completed
40  completed
95  completed
64  completed
23  completed
34  completed
29  completed
38  completed
55  completed
90  completed
88  completed
28  completed
4   completed
50  completed
8   completed
12  completed
0   completed
27  completed
99  completed
13  completed
72  completed
71  completed
45  completed
2   completed
91  completed
31  completed
14  completed
17  completed
7   completed
97  completed
35  completed
69  completed
20  completed
32  completed
5   completed
68  completed
36  completed
47  completed
87  completed
70  completed
84  completed
86  completed
66  completed
54  completed
42  completed
41  completed
46  completed
74  completed
57  completed
65  completed
80  completed
1   completed
19  completed
59  completed
15  completed
89  completed
51  completed
25  completed
53  completed
62  completed
58  completed
92  completed
76  completed
22  completed
56  completed
18  completed
85  completed
61  completed
30  completed
60  completed
67  completed
24  completed
26  completed
48  completed
39  completed
33  completed
52  completed
3   completed
93  completed
81  completed
78  completed
73  completed
44  completed
83  completed
49  completed
63  completed
82  completed
16  completed
Latch barrier passed for WaitingTask 0  
Latch barrier passed for WaitingTask 6  
Latch barrier passed for WaitingTask 5  
Latch barrier passed for WaitingTask 4  
Latch barrier passed for WaitingTask 1  
Latch barrier passed for WaitingTask 3  
Latch barrier passed for WaitingTask 2  
Latch barrier passed for WaitingTask 7  
Latch barrier passed for WaitingTask 8  
Latch barrier passed for WaitingTask 9 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值