文章标题

来源:互联网 发布:linux chromium log 编辑:程序博客网 时间:2024/06/08 11:13
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();}}
0 0