黑马程序员技术交流社区
标题:
经常用的一个线程同步器工具类。看看你们的理解。
[打印本页]
作者:
王少雷
时间:
2013-1-25 20:53
标题:
经常用的一个线程同步器工具类。看看你们的理解。
本帖最后由 王少雷 于 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开始。刚发现
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2