A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王少雷 于 2013-1-25 20:57 编辑

/**CountDownLatch
         * 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,
         * 它允许一个或多个线程一直等待。
                用给定的计数 初始化 CountDownLatch。
                由于调用了 countDown() 方法,所以在当前计数到达零之前,
                await 方法会一直受阻塞。之后,会释放所有等待的线程,
                await 的所有后续调用都将立即返回。
         */
看看这段代码,你们的理解,并给出不同注释。

public static void main(String[] args) {
                ExecutorService threadPool = Executors.newCachedThreadPool();
                //裁判控制器
                final CountDownLatch cdTeacher = new CountDownLatch(1);
                //运动员控制器
                final CountDownLatch cdAnswer = new CountDownLatch(3);
                for(int i=0; i<3; i++)
                {
                        Runnable runnable = new Runnable() {
                                public void run() {
                                        try
                                        {
                                                System.out.println("运动员:"+Thread.currentThread().getName()+
                                                                "正准备接受命令");
                                                // 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
                                                cdTeacher.await();//这里意思 就是先唤醒老师发令?
                                                System.out.println("运动员:"+Thread.currentThread().getName()+
                                                                "已接受命令");
                                                Thread.sleep((long)(Math.random()*5000));
                                                System.out.println("运动员:"+Thread.currentThread().getName()+
                                                                "报告成绩");
                                                // 递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
                                                cdAnswer.countDown();
                                        }
                                        catch(Exception e)
                                        {
                                                e.printStackTrace();
                                        }
                                }
                        };
                        threadPool.execute(runnable);
                }
                try
                {
                        //老师开始发令
                        Thread.sleep((long)(Math.random()*5000));
                        System.out.println("裁判:"+Thread.currentThread().getName()+
                                        "即将发布命令");
                        cdTeacher.countDown();//计数器减了一下,紧接等 成绩 ?
                        System.out.println("裁判:"+Thread.currentThread().getName()+
                                        "已发送命令,正在等待成绩");
                        cdAnswer.await();//等 运动员成绩
                        System.out.println("裁判:"+Thread.currentThread().getName()+
                                        "已收到成绩");
                }
                catch(Exception e)
                {
                        e.printStackTrace();
                }
                threadPool.shutdown();
        }
还有线程池里的,线程索引编号和线程池索引编号,默认都是从1开始。刚发现




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马