import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* CountDownLatch计数(百米赛跑模拟,子线程好比运动员,主线程好比裁判员)
* @author 谭飞
* @date 2012-02-07
*/
public class CountDownLatchTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ExecutorService threadPools = Executors.newCachedThreadPool();
final CountDownLatch cdl = new CountDownLatch(1);//子线程计数
final CountDownLatch cdlMain = new CountDownLatch(4);
for(int i = 0; i < 4; i++)
{
Runnable runnable = new Runnable(){
@Override
public void run() {
System.out.println("线程" + Thread.currentThread().getName()
+ "准备就绪,正等待主线程命令...");
try {
cdl.await();//子线程计数处于等待状态,当为0时就表示完成
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep((long)(Math.random()*10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName()
+ "完成任务,等待公布结果");
cdlMain.countDown();//主线程计数递减
}};
threadPools.execute(runnable);
}
//主线程操作
try
{
Thread.sleep((long)(Math.random() * 10000));
System.out.println("线程" + Thread.currentThread().getName()
+ "发布命令");
cdl.countDown();//子线程计数递减
System.out.println("等待各个线程的答复...");
cdlMain.await();
System.out.println("所有的线程已经完成任务");
}catch(Exception e)
{
e.printStackTrace();
}
threadPools.shutdown();//关闭线程池
}
}
CountDownLatch计数(百米赛跑模拟,子线程好比运动员,主线程好比裁判员)
最新推荐文章于 2022-07-21 20:23:06 发布