countDownLatch简介说明
下文笔者讲述countDownLatch简介说明,如下所示
countDownLatch简介
countDownLatch在java1.5被引入
跟它一起被引入的工具类
还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue
countDownLatch位于java.util.cucurrent包下
countDownLatch类的功能:
使一个线程等待其他线程各自执行完毕后再执行
countDownLatch通过一个计数器来实现
计数器的初始值是线程的数量
每当一个线程执行完毕后,计数器的值就-1
当计数器的值为0时,即所有线程都运行完毕
此时在闭锁上等待的线程就可以恢复工作了。
countDownLatch类方法简介
countDownLatch类中只提供了一个构造器
//参数count为计数值
public CountDownLatch(int count) { };
类中最重要的三个方法:
//调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public void await() throws InterruptedException { };
//和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };
//将count值减1
public void countDown() { };
例
public class CountDownLatchTest {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(2);
System.out.println("主线程开始执行…… ……");
//第一个子线程执行
ExecutorService es1 = Executors.newSingleThreadExecutor();
es1.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
System.out.println("子线程:"+Thread.currentThread().getName()+"执行");
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
}
});
es1.shutdown();
//第二个子线程执行
ExecutorService es2 = Executors.newSingleThreadExecutor();
es2.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("子线程:"+Thread.currentThread().getName()+"执行");
latch.countDown();
}
});
es2.shutdown();
System.out.println("等待两个线程执行完毕…… ……");
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("两个子线程都执行完毕,继续执行主线程");
}
}
----运行以上代码,将输出以下信息-----
主线程开始执行…… ……
等待两个线程执行完毕…… ……
子线程:pool-1-thread-1执行
子线程:pool-2-thread-1执行
两个子线程都执行完毕,继续执行主线程
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


