7 java并发编程实战 并发工具JUC之CountDownLatch( 二 )


7  java并发编程实战 并发工具JUC之CountDownLatch

文章插图
使用保证线程一、线程二执行完之后,再执行.out.("主线程结束....")
package com.javademo.demo.jucdemo;import java.util.concurrent.CountDownLatch;public class CountDownLatchDemo {private static CountDownLatch countDownLatch = new CountDownLatch(2);public static void main(String[] args) throws InterruptedException {new Thread(new Worker1()).start();new Thread(new Worker2()).start();countDownLatch.await();System.out.println("主线程结束....");}private static class Worker1 implements Runnable {@Overridepublic void run() {System.out.println("-线程1执行");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}finally {System.out.println("线程1完成--我休眠5秒");countDownLatch.countDown();}}}private static class Worker2 implements Runnable {@Overridepublic void run() {System.out.println("-线程2执行");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}finally {System.out.println("线程2完成--我休眠3秒");countDownLatch.countDown();}}}}
2、数据库连接池Druid的用法
典型的应用场景就是当一个服务启动时,同时会加载很多组件和服务,这时候主线程会等待组件和服务的加载 。当所有的组件和服务都加载完毕后,主线程和其他线程在一起完成某个任务 。
阿里巴巴的数据库连接池Druid中也用了来保证初始化 。
?
// 开启创建连接的线程,如果线程池createScheduler为null,//则开启单个创建连接的线程createAndStartCreatorThread();// 开启销毁过期连接的线程createAndStartDestroyThread();
四、和Join用法的区别
在使用join()中,多个线程只有在执行完毕之后才能被解除阻塞,而在中,线程可以在任何时候任何位置调用方法减少计数,通过这种方式,我们可以更好地控制线程的解除阻塞,而不是仅仅依赖于连接线程的完成 。
join()方法的执行逻辑如下图所示:
?
五、总结和注意事项
(int N) 中的计数器,可以让我们支持最多等待N个线程的操作完成,或是一个线程操作N次 。
如果仅仅只需要等待线程的执行完毕,那么join可能就能满足 。但是如果需要灵活的控制线程,使用 。
注意事项:.();
这一句话尽量写在中,或是保证此行代码前的逻辑正常运行,因为在一些情况下,出现异常会导致无法减1,然后出现死锁 。
是一次性使用的,当计数值在构造函数中初始化后,就不能再对其设置任何值,当使用完毕,也不能再次被使用 。