Java多线程之----CountDownLatch

本文介绍了并发编程中CountDownLatch的使用场景、原理及代码实现,通过实例展示了如何利用CountDownLatch确保多线程任务按顺序执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    有时候,会遇到这样一种情况,有多个任务,有一个主要任务需要等待其他子任务完成之后,才可以进行

    而多线程中的CountDownLatch则提供了这样的功能,在初始化的时候,可以指定一个计数器,在每个子线程完成任务的时候减一,等到计数器为0的时候,那么,主线程才会进行

    有这样的情景:要进行一次会议,会议要等到所有人都到齐了才可以开始,看下代码

public class CountDownLatchTest {
	public static void main(String[] args) {
		CountDownLatch conferenceBegin = new CountDownLatch(1);//计数器初始化为1
		CountDownLatch conferenceEnd = new CountDownLatch(5);//计数器初始化为5
		Conference conference = new Conference(conferenceBegin, conferenceEnd);
		new Thread(conference).start();
		for (int i = 0; i < 5; i++) {
			Participant participant = new Participant(conferenceBegin, conferenceEnd, "参与者" + (i + 1));
			new Thread(participant).start();
		}

	}
}

class Participant implements Runnable {
	private CountDownLatch conferenceBegin;
	private CountDownLatch conferenceEnd;
	private String name;

	public Participant(CountDownLatch conferenceBegin, CountDownLatch conferenceEnd, String name) {
		this.conferenceBegin = conferenceBegin;
		this.conferenceEnd = conferenceEnd;
		this.name = name;
	}

	@Override
	public void run() {
		try {
			conferenceBegin.await();// 使用await方法后,等到计数为0才继续执行
			Thread.sleep((int) (Math.random() * 10) * 1000);
			System.out.println(name + "进场");
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			conferenceEnd.countDown();// 使用一次countDown方法,计数减一
		}
	}
}

class Conference implements Runnable {
	private CountDownLatch conferenceEnd;
	private CountDownLatch conferenceBegin;

	public Conference(CountDownLatch conferenceBegin, CountDownLatch conferenceEnd) {
		this.conferenceEnd = conferenceEnd;
		this.conferenceBegin = conferenceBegin;
	}

	@Override
	public void run() {
		try {
			System.out.println("会议准备开始,在" + conferenceEnd.getCount() + "个人到达后开始");
			conferenceBegin.countDown();
			conferenceEnd.await();
			System.out.println("人数齐了,会议开始....");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
//会议准备开始,在5个人到达后开始
//参与者4进场
//参与者2进场
//参与者5进场
//参与者3进场
//参与者1进场
//人数齐了,会议开始....
    结果如上,在Paticipant线程中,调用了begin的await方法,那么在begin的计数器为0之前,程序不会继续向下运行,在Conference线程执行的时候,首先让begin的计数器减一,由于初始化为1,那么这个操作之后,begin的计数器就为0了,则Paticipant线程就可以继续运行了,每个线程运行完后,都会调用countDowm方法,当5个线程运行完后,end的计数器也为0了,此时Conference中由于调用await方法后面的代码就可以继续运行了

    这就是CountDownLatch的简单用法,也可以用在这样的情景上:在程序开始的时候,需要执行一些初始化操作,在初始化操作都好了之后,才能进行另外的操作,那么此时也是可以使用CountDownLatch来完成这种功能



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值