package cn.tool;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchTest {
/**
*CountDownLatch 用给定的计数 初始化
*由于调用了countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。
*之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
/**
* 创建3个子线程,1个主线程。主线程通知开始后,三个子线程再执行;三个子线程都执行完了之后,主线程宣告结果。
*/
ExecutorService pool=Executors.newCachedThreadPool();
final CountDownLatch mainL=new CountDownLatch(1);
final CountDownLatch subL=new CountDownLatch(3);
// 会创建三个子线程
for(int i=0;i<3;i++){
Runnable ren=new Runnable(){
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+
"正准备接受命令");
mainL.await();//当主线程发布命令后,mainL变为0,子线程才能往下执行
System.out.println(Thread.currentThread().getName()+
"已接受命令");
Thread.sleep(202);
subL.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
pool.execute(ren);
}
//主线程
Thread.sleep(200);
System.out.println(Thread.currentThread().getName()+
"正准备发布命令");
mainL.countDown();// mainL变为0,子线程会从阻塞的地方继续往下执行
System.out.println(Thread.currentThread().getName()+
"准备接受结果");
subL.await();// 等待子线程运行完(即subL=0)后才能运行
System.out.println(Thread.currentThread().getName()+
"接受到所有结果");
pool.shutdown();
}
}
文章标题
最新推荐文章于 2023-10-19 15:03:50 发布