线程同步辅助类CountDownLatch笔记

    CountDownLatch/门栓,在完成一组其它线程中执行的操作之前,该线程(可以是多个)一直等待。

    相信大家遇到过这样场景:在进行某个操作之前,先需要加载不同数据源的一系列数据,而每个加载可能相当耗时,客户端就只能一直等待。

    Demo:举行一个小型会议,所有人到齐了才能开会,如果有人迟到,大家一起干等大笑

    1.模拟会议进度线程

 

package java7.lesson4_CountdownLatch;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;

import util.Util;

public class Videoconference implements Runnable{
	private final CountDownLatch controller;
	private final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
	
	public Videoconference(int num){
		this.controller = new CountDownLatch(num);
	}
	
	public void arrive(String name){	
		Util.sop(df.format(new Date())+name+"来到了会议室");
		controller.countDown();	
		Util.sop("还有"+controller.getCount()+"还未到达");
	}
	
	@Override
	public void run() {
		Util.sop("本次会议预计"+controller.getCount()+"人到会");
		try {
			controller.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		Util.sop(df.format(new Date())+"全部到齐,会议开始");
	}

}

   说明:在countDown到0之前,该线程阻塞在await()处,倒计数为0,继续往下执行。

 

   2.与会者线程

 

package java7.lesson4_CountdownLatch;

public class Participant implements Runnable{
	private final String name;
	private final Videoconference room;
	
	public Participant(String name,Videoconference room){
		this.name = name;
		this.room = room;
	}
	
	@Override
	public void run() {
		try {
			Thread.sleep((long)(Math.random()*5000));
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		room.arrive(this.name);
	}

}

   3.测试

 

 

package java7.lesson4_CountdownLatch;

public class Client {

	public static void main(String[] args) {
		Videoconference room = new Videoconference(5);
		new Thread(room).start();
		
		new Thread(new Participant("领导", room)).start();
		new Thread(new Participant("员工1", room)).start();
		new Thread(new Participant("员工2", room)).start();
		new Thread(new Participant("员工3", room)).start();
		new Thread(new Participant("员工4", room)).start();		
	}

}

   测试结果:

 

本次会议预计5人到会
2014-08-30 18:31:50 员工1来到了会议室
还有4还未到达
2014-08-30 18:31:50 领导来到了会议室
还有3还未到达
2014-08-30 18:31:51 员工2来到了会议室
还有2还未到达
2014-08-30 18:31:52 员工3来到了会议室
还有1还未到达
2014-08-30 18:31:53 员工4来到了会议室
还有0还未到达
2014-08-30 18:31:53 全部到齐,会议开始

    结果符合预期。

    CountDownLatch比较简单,但比较实用:

      1.多个线程的进行准备工作,再开始后续工作。

      2.多个线程阻塞在await(),等待countdown到0,一起开始工作(比如一些测试场合)

    另外,CountDownLatch不能被重置,只能重新new一个。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值