阅读背景:

使用CountDownLatch来模拟马拉松比赛

来源:互联网 

import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 *
 * 应用CountDownLatch来摹拟马拉松竞赛
 *
 * @author 杨尚川
 */
public class MarathonSimulator {
    public static void main(String[] args) throws Exception{
        ExecutorService executorService = Executors.newCachedThreadPool();
        int personCount = 3;
        final CountDownLatch prepare = new CountDownLatch(personCount);
        final CountDownLatch start = new CountDownLatch(1);
        final CountDownLatch end = new CountDownLatch(personCount);
        final Queue<String> queue = new ConcurrentLinkedQueue<>();
        if(personCount < 3){
            System.out.println("参赛人数必需 > 2");
            return;
        }
        for(int i=1; i<=personCount; i++){
            final int personNumber = i;
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    //摹拟预备时光,应用随机数
                    try{
                        Thread.sleep(new Random(personNumber).nextInt(1000));
                    }catch(Exception e){}
                    System.out.println(personNumber+"号运发动预备终了");
                    prepare.countDown();
                    try {
                        //期待开端跑的命令
                        start.await();
                    }catch (Exception e){}
                    System.out.println(personNumber+"号运发动开端跑");
                    long s = System.currentTimeMillis();
                    //摹拟跑步时光,应用随机数
                    try{
                        Thread.sleep(new Random(personNumber).nextInt(10000));
                    }catch(Exception e){}
                    long c = System.currentTimeMillis() - s;
                    System.out.println(personNumber+"号运发动达到目标地,耗时:"+c+"毫秒");

                    end.countDown();
                    queue.add(personNumber+"号");
                }
            });
        }
        System.out.println("有"+personCount+"名运发动加入本次的马拉松竞赛");
        System.out.println("教练在期待运发动预备...\n");
        prepare.await();
        System.out.println("\n所有运发动预备终了,教练开端喊:预备 --- 跑!");
        start.countDown();
        System.out.println("\n教练在期待所有的运发动跑完...\n");
        end.await();

        System.out.println("\n所有运发动都跑完了,开端颁奖啦:");
        System.out.println("冠军是:"+queue.poll());
        System.out.println("亚军是:"+queue.poll());
        System.out.println("季军是:"+queue.poll());

        executorService.shutdown();
    }
}import java.util.Queue;
import java.util.Random;




你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: