多线程之CyclicBarrier-运动员百米赛跑
CyclicBarrier:一种同步辅助工具,允许一组线程相互等待以达到共同的障碍点。
package com.example.test.async; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Random; import java.util.concurrent.CyclicBarrier; /* * 运动员百米赛跑 * 听到枪响,运动员开始跑 * 运动员跑到终点保存成绩 * 所有运动员跑到终点后,成绩排序输出 */ public class CyclicBarrierTest { //运动员数量 private static int SPORTSMAN_COUNT = 10; private static final Random RANDOM = new Random(); private static List<Sportsman> SPORTS_SCORE = new ArrayList<>(SPORTSMAN_COUNT); // 设置所有运动员准备完毕的屏障点 private static final CyclicBarrier START = new CyclicBarrier(SPORTSMAN_COUNT, () -> { System.out.println("********所有运动员准备完毕********"); System.out.println("鸣枪。。。"); }); // 所有运动员都跑到终点的屏障点 private static final CyclicBarrier STOP = new CyclicBarrier(SPORTSMAN_COUNT, () -> { System.out.println("********所有运动员都跑到终点了********"); SPORTS_SCORE.sort(Comparator.comparingInt(Sportsman::getScore)); System.out.println("排名成绩单(单位ms):" + SPORTS_SCORE); }); public static void main(String[] args) { for (int i = 1; i <= SPORTSMAN_COUNT; i++) { new Thread(new RunTask(i + "号")).start(); } } /** * 运动员类 */ static class Sportsman { private String name; private int score; public Sportsman(String name, int score) { this.name = name; this.score = score; } @Override public boolean equals(Object obj) { boolean result = false; if (obj instanceof Sportsman) { result = ((Sportsman) obj).getScore() == this.score; } return result; } @Override public String toString() { return this.name + ":" + this.score; } public int getScore() { return score; } } static class RunTask implements Runnable { private String name; public RunTask(String name) { this.name = name; } @Override public void run() { try { // 运动员准备就绪的逻辑,准备readyTime秒 int readyTime = RANDOM.nextInt(1000); System.out.println(name + ":我需要" + readyTime + "秒的时间准备。"); try { Thread.sleep(readyTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ":我已经准备完毕!"); // 等待鸣枪开始 try { START.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ":开跑..."); int costTime = RANDOM.nextInt(500); try { Thread.sleep(costTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ":开跑到达终点。成绩:" + costTime + "ms"); SPORTS_SCORE.add(new Sportsman(name, costTime)); // 等待所有运动员跑到终点进行成绩排名 STOP.await(); } catch (Exception e) { e.printStackTrace(); } } } }
结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律