CountDownLatch


前言

日常生活中,通常我们完成一件事之后才会接着干下一件事,而一件事可能被分成多个环节由多个人去同步进行,有的人快,有的人慢。但不管怎样,只有全部人都完成了自己负责的环节才算这件事完成了,下一件事才得以继续。这跟java中的CountDownLatch很像,接下来我们就一起探讨下CountDownLatch


一、CountDownLatch概述

示例:一个或者多个线程需要在其它线程都完成任务之后才能执行,其它线程没有完成任务则需要等待。

二、代码示例

1.共享资源CounDown

提供计数方法(其它线程需要完成任务,则需要调用计数方法)、等待方法(其它线程没有完成任务,则需要调用该方法进行等待)

package countdown;

public class CountDown {
    private final int total;
    private int counter = 0;

    public CountDown(int total) {
        this.total = total;
    }

    public synchronized void count() {
        counter++;
        notifyAll();
    }

    public synchronized void await() throws InterruptedException {
        while (counter != total) {
            this.wait();
        }
    }
}

2.客户端

多个线程进行计数任务,当计数达到某个值之后,才进行下一件事的执行。在计数值没有完成前,执行第二件事的线程需要进行等待

package countdown;

import java.util.Random;
import java.util.stream.IntStream;

public class client {
    private final static Random random = new Random(System.currentTimeMillis());
    public static void main(String[] args) throws InterruptedException {
        System.out.println("任务开始了。。。。。。。。。");
        CountDown countDown = new CountDown(5);
        IntStream.rangeClosed(1, 5).forEach(x -> new Thread(() -> {
            System.out.println("The Thread "+Thread.currentThread().getName() + " is working......");
            try {
                Thread.sleep(random.nextInt(1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            countDown.count();
        }, String.valueOf(x)).start());
        countDown.await();
        System.out.println("第二阶段任务开始。。。。。。。。");
        System.out.println("do something");
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值