Java并发编程学习之CountDownLatch

在多线程编程时,常常需要解决线程同步问题,在上一节讲得BlockQueue的take和put方法,,是通过阻塞来控制生产者和消费者执行流程,它其实也是在解决线程同步问题。另外在线程同步问题还可以通过很多方式解决比如信号量,栅栏,闭锁。今天所说的CountDownLatch就是一种闭锁同步类,它的作用就像一扇门,在达到结束状态之前门是关闭的,并且没有任何线程可以通过这扇门,当达到了结束状态,门打开,所有的线程可以通过。并且结束后,不会再关闭。

CountDownLatch简介

CountDownLatch是一种闭锁的实现,它通过一个计数器来实现。 1、在初始化时,指定等待线程的数量。 2、每个线程结束时,调用countDown将等待数量减1 3、它会有一个await方法,来等待线程全部执行结束。

代码以及使用场景示例

假设如下场景:在一个批处理程序中,一次从一个远程接口中,拉取数据需要耗时非常长的时间,这时考虑到使用多线程去拉,可以减少线程等待的时间。这时就可以使用CountDownLatch来做线程同步,来保证每个线程都执行完成来继续下面的流程。

{private static ExecutorService executor= Executors.newFixedThreadPool(5);(String[] args){CountDownLatch countDownLatch=new CountDownLatch(10);for(int index=0;index<10;index++) {executor.execute(new Task(index*10,(index+1)*10,countDownLatch));}try {System.out.println(“开始等待线程执行…”);countDownLatch.await();System.out.println(“全部线程执行完毕”);} catch (InterruptedException e) {e.printStackTrace();}}{private int startIndex;private int count;private CountDownLatch countDownLatch;public Task(int startIndex, int count,CountDownLatch countDownLatch) {this.startIndex = startIndex;this.count = count;this.countDownLatch=countDownLatch;}() {try {Thread.sleep((long) (1000 * Math.random()));} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getId()+”执行完成。”);countDownLatch.countDown();}}}

以上代码模拟了上述假设中得场景。其中使用了线程池来做线程管理,这些对象也将在后续介绍。 输出结果如下:

开始等待线程执行…12执行完成。11执行完成。12执行完成。11执行完成。13执行完成。13执行完成。9执行完成。10执行完成。12执行完成。11执行完成。全部线程执行完毕

不必在乎目的地,在乎的是沿途的风景以及看风景的心情,让心灵去旅行!

Java并发编程学习之CountDownLatch

相关文章:

你感兴趣的文章:

标签云: