`

CountDownLatch1

 
阅读更多

 

       个人理解为倒计数锁,让一个或几个线程等待另外一个或几个线程执行完毕,才继续执行

如10个子线程执行完毕,主线程才能执行等等吧

  

下面提供两个例子来说明具体使用: 

同步计数器 

/**

 * 同步计数器 

 * 作用:同步N个线程执行

 * 1 让所有线程同一时间开始执行 

 * 2 主线程等待所有子线程执行完毕,才能结束 

 * @author root

 * 

 * 场景设想:

 *  不同时间招来10个工人(创建并开启10个线程,但时间各不相同)

 *  一起搬运一个大箱子(10个线程在执行搬运方法是同时的),

 *  大家必须统一时间用力,才能保证搬运的协调

 *  运送到目的地后,当所有人把箱子放下,则整个搬运结束 (主线程等待所有子线程结束,才结束)

 */

代码:

  

public class CountDownLatchTest {

	public static void main(String[] args) {
		//工人用力同步标识,工人准备结束,则一同开始
		CountDownLatch startFlag = new CountDownLatch(1);
		//所有线程执行完毕标识
		CountDownLatch allEndFlag = new CountDownLatch(10);
		try {
			for(int i=0;i<10;i++){
				Thread.sleep(500);//利用sleep 可以说明 工人来到工地的时间是不同的 
				SlaveThread worker =  new SlaveThread(startFlag,allEndFlag,i);
				worker.start();
			}
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
		startFlag.countDown(); //标识主线程通知子线程 工人准备完毕,可以开始用力 
		
		try {
			allEndFlag.await();
			System.out.println();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} 
		System.out.println("主任务完成。。");
	}
}
//工人类
class SlaveThread  extends Thread{
	//工人编号
	private Integer number ; 
	//线程开始标识
	private CountDownLatch startFlag;
	//当前工人用力完毕 则减一
	private CountDownLatch allEndFlag;
	
	public SlaveThread(CountDownLatch startFlag,CountDownLatch allEndFlag ,  int number){
		this.number = number ;
		this.startFlag = startFlag ; 
		this.allEndFlag = allEndFlag ; 
	}
	
	@Override
	public void run() {
		
		try {
			startFlag.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		long start = System.currentTimeMillis() ; 
		
		System.out.println( "工人+"+number+"起止时间"+start+Thread.currentThread());
		takeUp() ;
		
		//当前工人用力完毕,结束
		allEndFlag.countDown(); 
		System.out.println( "工人"+number+"完成");
	}
	
	//抬起
	public void takeUp(){
		try {
			//抬起箱子总共花费时间 3s
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

 执行结果:理想情况下10个工人线程起止时间应该相同,但是总有几毫秒的差异,

                 个人猜想可能是因为机器不能同时执行10个线程吧

                  在网上找了一下,机器同时执行的线程数少于等于cpu数目。

 

工人+9起止时间1440488675796Thread[Thread-9,5,main]
工人+1起止时间1440488675796Thread[Thread-1,5,main]
工人+3起止时间1440488675796Thread[Thread-3,5,main]
工人+6起止时间1440488675796Thread[Thread-6,5,main]
工人+2起止时间1440488675796Thread[Thread-2,5,main]
工人+5起止时间1440488675796Thread[Thread-5,5,main]
工人+4起止时间1440488675796Thread[Thread-4,5,main]
工人+7起止时间1440488675797Thread[Thread-7,5,main]
工人+8起止时间1440488675797Thread[Thread-8,5,main]
工人+0起止时间1440488675796Thread[Thread-0,5,main]

 

 

分享到:
评论

相关推荐

    多线程countDownLatch方法介绍

    1. 初始化:通过`CountDownLatch(int count)`构造方法创建一个CountDownLatch实例,其中count参数表示计数器的初始值。 ```java CountDownLatch latch = new CountDownLatch(3); // 设置为3,表示有3个子任务 ``` 2....

    CountDownLatch和CyclicBarrier用法实例大全

    1. **初始化**: 通过`CountDownLatch(int count)`构造函数初始化,`count`表示倒计时的次数。 2. **countDown()**: 当一个线程完成其任务时,调用此方法,计数器减1。 3. **await()**: 其他线程调用`await()`会阻塞...

    利用 CountDownLatch 类实现线程同步

    1. **初始化异步操作**:在 Activity 或 Fragment 的生命周期方法中,如果需要先执行一系列异步操作(如网络请求、数据库初始化等)再显示界面,可以使用 `CountDownLatch` 来等待这些异步操作完成。 2. **并发测试...

    CountDownLatch学习用法

    1. **构造方法**:CountDownLatch的构造函数接收一个整数参数,这个整数就是计数器的初始值。例如,如果初始化为3,表示需要等待3个线程完成任务。 ```java CountDownLatch latch = new CountDownLatch(3); ``` 2....

    CountDownLatch练习

    1. **CountDownLatch与CyclicBarrier的区别**:CountDownLatch是一次性的,计数到零后无法重用;CyclicBarrier可以重置,允许多次同步点。 2. **如何避免死锁与饥饿**:在使用CountDownLatch时,要确保所有线程都能...

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    1. 创建一个CountDownLatch实例,初始化为线程数量。 2. 将数据分为多个批次,每个批次分配给一个线程处理。 3. 每个线程在开始执行前调用`latch.countDown()`,表示它已经准备好开始工作。 4. 线程执行数据插入操作...

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...

    CountDownLatch的使用

    递减锁存器CountDownLatch的使用以及注意事项!

    并发编程之CountDownLatch

    final CountDownLatch cdOrder = new CountDownLatch(1); final CountDownLatch cdAnswer = new CountDownLatch(3); ExecutorService threadPool = Executors.newCachedThreadPool(); for (int i = 0; i ; i++) ...

    CountDownLatch与thread.join()的区别

    CountDownLatch与thread.join()的区别

    CountDownLatch Demo

    1. **初始化与构造函数**: CountDownLatch 的构造函数接收一个 int 参数,表示计数器的初始值。例如,如果初始值为 3,意味着需要三个线程各自完成任务后,计数器才会归零。 2. **countDown() 方法**: 当一个...

    CountDownLatch详解.docx

    CountDownLatch 是 Java 中的一个同步工具类,位于 `java.util.concurrent` 包下,它主要用于多线程间的协作,尤其在需要等待所有线程执行完指定任务后才能继续执行的情况。这个类通过一个计数器(计数down)来实现...

    countdownlatch-example-sourcecode.zip

    1. **CountDownLatch简介** CountDownLatch是一个计数器,初始化时设置一个初始值,然后多个线程可以等待这个计数器归零。一旦计数器归零,所有等待的线程都将被释放,可以继续执行。通常用于确保所有线程都完成...

    并发编程——并发工具类.pdf

    1. **概念与作用**:CountDownLatch是一个同步辅助类,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。它本质上是一个倒计时门闩,用于控制一个线程或者多个线程的等待与继续执行。 2. **使用...

    并发编程之Tools&CountDownLatch&Semaphore原理与应用1

    1. `CountDownLatch(int count)`:构造一个CountDownLatch,初始计数值为count。 2. `void countDown()`:表示一个任务完成,计数值减1。 3. `void await() throws InterruptedException`:使当前线程等待,直到计...

    Java并发包之CountDownLatch用法.docx

    public ThreadTest1(CountDownLatch latch) { this.latch = latch; } @Override public void run() { // 模拟乘客1登机 // ... latch.countDown(); // 乘客1登机完成 } } // 同理,创建ThreadTest2和...

    JAVA多线程CountDownLatch使用详解

    例如,在上面的代码中,我们创建了一个CountDownLatch对象,并指定了一个计数值为1。然后,在MyThread1线程中,我们调用了countDown()方法来将计数值减1。当MyThread1线程执行完毕后,计数值就减到0了,这时MyThread...

    Java concurrency之CountDownLatch原理和示例_动力节点Java学院整理

    1. CountDownLatch只是一次性的,一旦计数器归零,就不能再重置。这意味着它适用于一次性的事件,比如初始化过程或者一次性的竞赛。 2. CyclicBarrier则可以重置,允许线程多次等待彼此,因此适合在循环中使用,如...

    27 倒数计时开始,三、二、一—CountDownLatch详解.pdf

    1. **理解 CountDownLatch** CountDownLatch 的名字来源于其工作原理,就像倒数计时一样,从一个初始设定的计数值开始,每当一个线程完成其任务,计数值就会减一。当计数值为零时,意味着所有线程都已经完成了它们...

    Java中CountDownLatch用法解析

    在Java并发编程中,`CountDownLatch`是一个非常重要的工具类,它位于`java.util.concurrent`包下,用于协调多个线程间的同步。`CountDownLatch`的主要作用是允许一个或多个线程等待其他线程完成操作。在上述例子中,...

Global site tag (gtag.js) - Google Analytics