CountDownLatch计数(百米赛跑模拟,子线程好比运动员,主线程好比裁判员)

来源:互联网 发布:Oracle sql 字符串函数 编辑:程序博客网 时间:2024/05/09 23:28
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 stubExecutorService 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(){@Overridepublic 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();//关闭线程池}}

原创粉丝点击