`
pjwqq
  • 浏览: 81474 次
社区版块
存档分类
最新评论

线程同步辅助类CountDownLatch笔记

    博客分类:
  • nio
阅读更多

    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一个。

 

1
0
分享到:
评论
4 楼 pjwqq 2014-09-01  
求求你帮帮我 写道
import util.Util;  这个是什么意思

工具类,没啥用,请忽略
3 楼 求求你帮帮我 2014-08-31  
import util.Util;  这个是什么意思
2 楼 pjwqq 2014-08-31  
bit1129 写道
这个代码工作中拿不出手

这个是一个例子,能聊聊心得吗,学习下
1 楼 bit1129 2014-08-30  
这个代码工作中拿不出手

相关推荐

    java中的并发变成学习笔记2

    - **CountDownLatch**:它是一个一次性使用的同步辅助类,用于计数。当计数器归零时,所有等待的线程会被释放。在并行计算场景中,CountDownLatch常用来确保所有子任务执行完毕后再进行下一步操作。例如,在`...

    juc尚硅谷-自学笔记

    3. **CountDownLatch**:这是一个同步辅助类,用于控制多个线程的并发访问。计数器从1开始,每当一个线程完成任务时计数器减1,当计数器为0时,所有等待的线程才能继续执行。 4. **CyclicBarrier**:循环栅栏允许一...

    毕向东 笔记源码

    6. **线程编程**:线程的创建、同步机制(synchronized关键字、wait/notify机制)、并发工具类(ExecutorService、Semaphore、CountDownLatch等)。 7. **反射机制**:如何在运行时获取类的信息,动态创建对象,...

    java.util.concurrent 测试源文件

    8. ** Phaser**:Phaser是一个更灵活的同步辅助类,可以替代CyclicBarrier或Semaphore,它允许多个阶段的协调,并且可以动态调整参与者的数量。 在给定的文件中,`pom.xml`可能是Maven项目的配置文件,它包含了项目...

    javase基础学习笔记

    8. **多线程**:创建和管理线程,理解同步机制(synchronized关键字和Lock接口),以及并发工具类如Semaphore、CountDownLatch和CyclicBarrier。 9. **网络编程**:使用Socket进行客户端/服务器通信,理解TCP和UDP...

    Java Concurrency In Practice Learning Note

    - **CyclicBarrier和CountDownLatch**:同步辅助类,用于协调多线程间的协作,例如等待所有线程到达某一点后再继续执行。 3. **并发集合** - **线程安全的集合**:如`ConcurrentHashMap`、`CopyOnWriteArrayList`...

    redis、activemq、juc、jvm、gc等知识点的脑图.rar

    ConcurrentHashMap是线程安全的哈希表,ReentrantLock是可重入的互斥锁,CountDownLatch和CyclicBarrier是同步辅助类,用于控制多个线程的协作。 脑图是一种图形化的学习工具,能帮助我们组织和理解复杂的信息。在...

    jvm-juc:jvm学习笔记

    6. CyclicBarrier和CountDownLatch:同步辅助类,CyclicBarrier用于多线程同步到达某一点后一起开始下一个阶段,而CountDownLatch用于一次性阻塞多个线程,直到计数到零。 7. Semaphore:信号量,用于限制同时访问...

    八股文免费资源下载.zip

    - 线程:线程的创建、同步控制(synchronized、Lock)、死锁预防。 - 高级特性:CountDownLatch、CyclicBarrier、Semaphore的应用。 - Executor框架:ThreadPoolExecutor的配置与使用。 6. **IO流** - 文件操作...

    massive-intense-learningrepo:我用来保存东西的仓库

    5. **多线程**:线程的创建、同步、互斥锁、并发工具类如Semaphore和CountDownLatch等。 6. **Java虚拟机(JVM)**:JVM的工作原理,内存模型,垃圾回收机制,类加载机制等。 7. **设计模式**:工厂模式、单例模式...

Global site tag (gtag.js) - Google Analytics