CountDownLatch的用法
2017-10-26 00:00
405 查看
摘要: CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。
1.
1.
package com.test.frame.test.countDownLatch; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.CountDownLatch; /** * created by guanguan on 2017/10/26 **/ public class CountDownLatchDemo { final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); static class Worker extends Thread { private String workName; private int workTime; CountDownLatch latch; public Worker(String workName, int workTime, CountDownLatch latch) { this.workName = workName; this.workTime = workTime; this.latch = latch; } public Worker(Worker worker) { } @Override public void run() { System.out.println("worker : "+workName +"start begin at "+sdf.format(new Date())); doWork(); System.out.println("worker : "+workName +"start complete at "+sdf.format(new Date())); } private void doWork() { try { Thread.sleep(workTime); } catch (InterruptedException e) { e.printStackTrace(); }finally { latch.countDown();//工人完成工作,计数器减一 } } } public static void main(String[] args) throws InterruptedException { /** * 初始化CountDownLatch,将其值置为2,latch计数器的操作是原子性的 */ CountDownLatch latch=new CountDownLatch(2); Worker worker1= new Worker("WORK-1",5000,latch); Worker worker2= new Worker("WORK-2",2000,latch); Worker worker3= new Worker("WORK-3",1000,latch); worker1.start(); latch.await(); //此时将永远阻塞,因为只有一个线程开启,完成任务 worker2.start(); worker3.start(); } } 运行结果是: worker : WORK-1start begin at 2017-10-26 14:32:54 worker : WORK-1start complete at 2017-10-26 14:32:59 此时由于latch.await()的原因,则线程将永远阻塞,因为latch还是1,没有置为0,则线程2,线程3将无法进行 如果将 latch.await(); //此时将永远阻塞,因为只有一个线程开启,完成任务 worker2.start(); 这两行对换, public static void main(String[] args) throws InterruptedException { CountDownLatch latch=new CountDownLatch(2);//两个工人的协作 Worker worker1= new Worker("WORK-1",5000,latch); Worker worker2= new Worker("WORK-2",2000,latch); Worker worker3= new Worker("WORK-3",1000,latch); worker1.start(); worker2.start(); latch.await(); worker3.start(); } 运行结果如下: worker : WORK-2start begin at 2017-10-26 14:34:35 worker : WORK-1start begin at 2017-10-26 14:34:35 worker : WORK-2start complete at 2017-10-26 14:34:37 worker : WORK-1start complete at 2017-10-26 14:34:40 worker : WORK-3start begin at 2017-10-26 14:34:40 worker : WORK-3start complete at 2017-10-26 14:34:41 Process finished with exit code 0 表明线程1,线程2同时运行,并阻塞,然后1,2全部完成之后,线程3才开始运行
相关文章推荐
- 【JAVA-并发】CountDownLatch用法和源码浅析
- CountDownLatch用法
- 多线程辅助类-CountDownLatch的用法
- CountDownLatch的用法
- CountDownLatch的用法
- Java多线程---CountDownLatch用法实例
- 多线程辅助类-CountDownLatch的用法
- 浅析Java中CountDownLatch用法
- CountDownLatch和CyclicBarrier 的用法
- 两个重要的多线程辅助类之CyclicBarrier和CountDownLatch的用法
- CountDownLatch用法
- CountDownLatch 用法
- CountDownLatch的用法
- CountDownLatch的用法
- countdownlatch的用法
- 浅析Java中CountDownLatch用法
- java 多线程 CountDownLatch用法
- CountDownLatch的用法
- CountDownLatch 多线程同步辅助类用法
- 闭锁CountDownLatch的用法