个人理解为倒计数锁,让一个或几个线程等待另外一个或几个线程执行完毕,才继续执行
如10个子线程执行完毕,主线程才能执行等等吧
下面提供两个例子来说明具体使用:
1 同步计数器
/**
* 同步计数器
* 作用:同步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]
相关推荐
1. 初始化:通过`CountDownLatch(int count)`构造方法创建一个CountDownLatch实例,其中count参数表示计数器的初始值。 ```java CountDownLatch latch = new CountDownLatch(3); // 设置为3,表示有3个子任务 ``` 2....
1. **初始化**: 通过`CountDownLatch(int count)`构造函数初始化,`count`表示倒计时的次数。 2. **countDown()**: 当一个线程完成其任务时,调用此方法,计数器减1。 3. **await()**: 其他线程调用`await()`会阻塞...
1. **初始化异步操作**:在 Activity 或 Fragment 的生命周期方法中,如果需要先执行一系列异步操作(如网络请求、数据库初始化等)再显示界面,可以使用 `CountDownLatch` 来等待这些异步操作完成。 2. **并发测试...
1. **构造方法**:CountDownLatch的构造函数接收一个整数参数,这个整数就是计数器的初始值。例如,如果初始化为3,表示需要等待3个线程完成任务。 ```java CountDownLatch latch = new CountDownLatch(3); ``` 2....
1. **CountDownLatch与CyclicBarrier的区别**:CountDownLatch是一次性的,计数到零后无法重用;CyclicBarrier可以重置,允许多次同步点。 2. **如何避免死锁与饥饿**:在使用CountDownLatch时,要确保所有线程都能...
1. 创建一个CountDownLatch实例,初始化为线程数量。 2. 将数据分为多个批次,每个批次分配给一个线程处理。 3. 每个线程在开始执行前调用`latch.countDown()`,表示它已经准备好开始工作。 4. 线程执行数据插入操作...
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...
递减锁存器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()的区别
1. **初始化与构造函数**: CountDownLatch 的构造函数接收一个 int 参数,表示计数器的初始值。例如,如果初始值为 3,意味着需要三个线程各自完成任务后,计数器才会归零。 2. **countDown() 方法**: 当一个...
CountDownLatch 是 Java 中的一个同步工具类,位于 `java.util.concurrent` 包下,它主要用于多线程间的协作,尤其在需要等待所有线程执行完指定任务后才能继续执行的情况。这个类通过一个计数器(计数down)来实现...
1. **CountDownLatch简介** CountDownLatch是一个计数器,初始化时设置一个初始值,然后多个线程可以等待这个计数器归零。一旦计数器归零,所有等待的线程都将被释放,可以继续执行。通常用于确保所有线程都完成...
1. **概念与作用**:CountDownLatch是一个同步辅助类,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。它本质上是一个倒计时门闩,用于控制一个线程或者多个线程的等待与继续执行。 2. **使用...
1. `CountDownLatch(int count)`:构造一个CountDownLatch,初始计数值为count。 2. `void countDown()`:表示一个任务完成,计数值减1。 3. `void await() throws InterruptedException`:使当前线程等待,直到计...
在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...
public ThreadTest1(CountDownLatch latch) { this.latch = latch; } @Override public void run() { // 模拟乘客1登机 // ... latch.countDown(); // 乘客1登机完成 } } // 同理,创建ThreadTest2和...
例如,在上面的代码中,我们创建了一个CountDownLatch对象,并指定了一个计数值为1。然后,在MyThread1线程中,我们调用了countDown()方法来将计数值减1。当MyThread1线程执行完毕后,计数值就减到0了,这时MyThread...
1. CountDownLatch只是一次性的,一旦计数器归零,就不能再重置。这意味着它适用于一次性的事件,比如初始化过程或者一次性的竞赛。 2. CyclicBarrier则可以重置,允许线程多次等待彼此,因此适合在循环中使用,如...
1. **理解 CountDownLatch** CountDownLatch 的名字来源于其工作原理,就像倒数计时一样,从一个初始设定的计数值开始,每当一个线程完成其任务,计数值就会减一。当计数值为零时,意味着所有线程都已经完成了它们...