日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

有一個(gè)賽跑比賽,4個(gè)人參賽,給前三名頒發(fā)得金銀銅牌,用代碼怎么寫(xiě)呢

 

//運(yùn)動(dòng)員
@Data
@RequiredArgsConstructor
public static class Runner {
    private final String name;
    private Integer score;
}
// 頒獎(jiǎng)?lì)?public static class AwardUtils {
    private static BlockingQueue<String> awardQueue = new LinkedBlockingQueue<>(3);
    static {
        awardQueue.offer("金牌");
        awardQueue.offer("銀牌");
        awardQueue.offer("銅牌");
    }
    public static void winAward(String name) {
        String award = awardQueue.poll();
        if (award != null) {
            log.info("{} 獲得了 {}", name,  award);
        } else {
            log.info("{} 沒(méi)有獲得獎(jiǎng)牌", name);
        }
    }
}

普通做法:我們可以等運(yùn)動(dòng)員跑玩,看誰(shuí)用時(shí)少來(lái)頒獎(jiǎng)

CountDownLatch countDownLatch = new CountDownLatch(1);
// 賽跑任務(wù)
Function<Runner, Callable<Runner>> runTask = (runner) -> () -> {
    countDownLatch.await();
    int time = ThreadLocalRandom.current().nextInt(10, 20);
    runner.setScore(time);
    TimeUnit.SECONDS.sleep(time);
    log.info("{} 跑了 {} 秒", runner.getName(), time);
    return runner;
};
ExecutorService executor = Executors.newFixedThreadPool(4);
List<Future<Runner>> results = Arrays.asList(
        executor.submit(runTask.Apply(new Runner("小明"))),
        executor.submit(runTask.apply(new Runner("小鵬"))),
        executor.submit(runTask.apply(new Runner("小張"))),
        executor.submit(runTask.apply(new Runner("小李")))
);
countDownLatch.countDown();
results.stream().map(future -> {
    try {
        return future.get(20, TimeUnit.SECONDS);
    } catch (TimeoutException | InterruptedException | ExecutionException e) {
        throw new RuntimeException(e);
    }
}).sorted((runner1, runner2) -> {
    int score1 = runner1.getScore();
    int score2 = runner2.getScore();
    return Integer.compare(score1, score2);
}).forEach(runner -> {
    AwardUtils.winAward(runner.getName());
});
11:21:38,915 [pool-1-thread-2] INFO - 小鵬 跑了 11 秒
11:21:42,908 [pool-1-thread-4] INFO - 小李 跑了 15 秒
11:21:43,901 [pool-1-thread-3] INFO - 小張 跑了 16 秒
11:21:43,901 [pool-1-thread-1] INFO - 小明 跑了 16 秒
11:21:43,902 [main] INFO - 小鵬 獲得了 金牌
11:21:43,902 [main] INFO - 小李 獲得了 銀牌
11:21:43,902 [main] INFO - 小明 獲得了 銅牌
11:21:43,902 [main] INFO - 小張 沒(méi)有獲得獎(jiǎng)牌

CompletionService:有人跑完了就把獎(jiǎng)牌給他,不用等其他人是否跑完
主要功能就是一邊執(zhí)行任務(wù),一邊獲取任務(wù)的返回值。讓兩件事分開(kāi)執(zhí)行,任務(wù)之間不會(huì)互相阻塞,可以實(shí)現(xiàn)先執(zhí)行完的先取結(jié)果,不依賴任務(wù)順序

CountDownLatch countDownLatch = new CountDownLatch(1);
Function<Runner, Callable<Runner>> runTask = (runner) -> () -> {
    countDownLatch.await();
    int time = ThreadLocalRandom.current().nextInt(10, 20);
    runner.setScore(time);
    TimeUnit.SECONDS.sleep(time);
    log.info("{} 跑了 {} 秒", runner.getName(), time);
    return runner;
};
ExecutorService executor = Executors.newFixedThreadPool(4);
CompletionService<Runner> completionService = new ExecutorCompletionService<>(executor);
completionService.submit(runTask.apply(new Runner("小明")));
completionService.submit(runTask.apply(new Runner("小鵬")));
completionService.submit(runTask.apply(new Runner("小張")));
completionService.submit(runTask.apply(new Runner("小李")));
countDownLatch.countDown();
for (int i = 0; i < 4; i++) {
    AwardUtils.winAward(completionService.take().get().getName());
}
11:11:15,125 [pool-1-thread-3] INFO  - 小張 跑了 10 秒
11:11:15,130 [main] INFO  - 小張 獲得了 金牌
11:11:19,122 [pool-1-thread-1] INFO   - 小明 跑了 14 秒
11:11:19,122 [main] INFO   - 小明 獲得了 銀牌
11:11:20,125 [pool-1-thread-4] INFO   - 小李 跑了 15 秒
11:11:20,125 [main] INFO   - 小李 獲得了 銅牌
11:11:22,132 [pool-1-thread-2]  - 小鵬 跑了 17 秒
11:11:22,132 [main] INFO  - 小鵬 沒(méi)有獲得獎(jiǎng)牌

ExecutorCompletionService 類(lèi)中維護(hù)一個(gè)了 BlockingQueue;

public class ExecutorCompletionService<V> implements CompletionService<V> {
    private final BlockingQueue<Future<V>> completionQueue;
    public Future<V> submit(Callable<V> task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<V> f = newTaskFor(task);
        executor.execute(new QueueingFuture(f));
        return f;
    }
}

QueueingFuture 重寫(xiě)了done 方法 ,done 方法會(huì)在完成或取消任務(wù)時(shí)執(zhí)行,將其加入隊(duì)列

private class QueueingFuture extends FutureTask<Void> {
    QueueingFuture(RunnableFuture<V> task) {
        super(task, null);
        this.task = task;
    }
    protected void done() { completionQueue.add(task); }
    private final Future<V> task;
}

分享到:
標(biāo)簽:JDK
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定