闭锁CountDownLatch的用法
2017-02-10 10:50
423 查看
现在有十个线程各自输出0-50000中的所有偶数,假设我们试图使用下面这段代码计算整个程序的执行时间:
会发现无法达到预期的效果,甚至在输出的最后一行根本看不到“total time is XXX”的结果,这是正常的,因为在这个多线程的环境下,或许当其他线程还没有将偶数完全输出,main线程已经将时间计算完毕并且输出了。要解决这个问题,我们需要使main线程中计算时间的代码在其他所有线程运算全部完成之后才执行,这就是CountDownLatch的功能,下面我们使用CountDownLatch来改进程序:
运行程序,发现可以正常计算整个程序的执行时间:
package concurrent; class LatchDemo implements Runnable { @Override public void run() { for (int i = 0; i <= 50000; i++) System.out.println(i); } } public class TestCountDownLatch { public static void main(String[] args) { LatchDemo ld = new LatchDemo(); long start = System.currentTimeMillis(); for (int i = 0; i < 5; i++) new Thread(ld).start(); long end = System.currentTimeMillis(); System.out.println("total time is " + (end - start)); } }
会发现无法达到预期的效果,甚至在输出的最后一行根本看不到“total time is XXX”的结果,这是正常的,因为在这个多线程的环境下,或许当其他线程还没有将偶数完全输出,main线程已经将时间计算完毕并且输出了。要解决这个问题,我们需要使main线程中计算时间的代码在其他所有线程运算全部完成之后才执行,这就是CountDownLatch的功能,下面我们使用CountDownLatch来改进程序:
package concurrent; import java.util.concurrent.CountDownLatch; class LatchDemo implements Runnable { private CountDownLatch latch; public LatchDemo(CountDownLatch latch) { this.latch = latch; } @Override public void run() { try { for (int i = 0; i < 50000; i++) System.out.println(i); } finally { //使用finally确保倒计时操作一定可以执行 latch.countDown(); } } } public class TestCountDownLatch { public static void main(String[] args) { //参数5对应要等待的线程数量,我们在下面创建了5个线程 CountDownLatch latch = new CountDownLatch(5); LatchDemo ld = new LatchDemo(latch); long start = System.currentTimeMillis(); for (int i = 0; i < 5; i++) new Thread(ld).start(); //等待其他所有线程的运算全部完成 try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("total time is " + (end - start)); } }
运行程序,发现可以正常计算整个程序的执行时间:
相关文章推荐
- 闭锁 CountDownLatch
- CountDownLatch 闭锁的一个简单应用
- Java多线程之1-- CountDownLatch的用法
- CountDownLatch的用法
- 闭锁CountDownLatch
- Java并发API:闭锁 CountDownLatch
- CountDownLatch和CyclicBarrier 的用法
- java多线程 -- CountDownLatch 闭锁
- Java 并发专题 :闭锁 CountDownLatch
- CountDownLatch 用法
- 多线程辅助类-CountDownLatch的用法
- CountDownLatch的用法
- 闭锁CountDownLatch的源码实现介绍
- 多线程辅助类-CountDownLatch的用法
- Java并发学习笔记(三)-闭锁CountDownLatch
- 浅析Java中CountDownLatch用法
- 浅析Java中CountDownLatch用法
- CountDownLatch的用法
- CountDownLatch的用法
- 闭锁 CountDownLatch