模拟实现百米赛跑的编程方法如下:
方法一:使用CountDownLatch
设计思路
使用`CountDownLatch`来控制线程的启动和结束。
一个`CountDownLatch`用于裁判,初始化为1,表示裁判吹哨后开始比赛。
另一个`CountDownLatch`用于10名玩家,初始化为10,表示所有玩家准备好后裁判吹哨。
使用线程池创建10个线程,每个线程代表一个玩家。
每个玩家在初始化时调用裁判`CountDownLatch`的`await()`方法,等待比赛开始。
当所有玩家都准备好后,裁判调用`countDown()`方法,吹哨开始比赛。
玩家线程在跑步过程中随机生成速度,当跑完100米后,调用自己`CountDownLatch`的`countDown()`方法。
当所有玩家都跑完后,裁判`CountDownLatch`的计数器为0,比赛结束,释放线程池。
代码实现
```java
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadLocalRandom;
public class百米赛跑 {
public static void main(String[] args) throws InterruptedException {
int playerCount = 10;
CountDownLatch readyLatch = new CountDownLatch(1);
CountDownLatch startLatch = new CountDownLatch(playerCount);
ExecutorService executor = Executors.newFixedThreadPool(playerCount);
for (int i = 0; i < playerCount; i++) {
executor.execute(new Player(i, readyLatch, startLatch));
}
// 所有玩家准备好后,裁判吹哨开始比赛
readyLatch.await();
startLatch.countDown();
// 等待所有玩家跑完
startLatch.await();
executor.shutdown();
}
}
class Player implements Runnable {
private int playerId;
private CountDownLatch readyLatch;
private CountDownLatch startLatch;
public Player(int playerId, CountDownLatch readyLatch, CountDownLatch startLatch) {
this.playerId = playerId;
this.readyLatch = readyLatch;
this.startLatch = startLatch;
}
@Override
public void run() {
try {
// 模拟准备阶段
readyLatch.await();
// 模拟跑步阶段
while (true) {
int distance = ThreadLocalRandom.current().nextInt(10) + 1; // 随机生成跑步距离,1到10米
System.out.println("Player " + playerId + " ran " + distance + " meters.");
Thread.sleep(ThreadLocalRandom.current().nextInt(100)); // 随机生成跑步时间,0到99毫秒
if (distance == 100) {
// 到达终点
startLatch.countDown();
break;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
方法二:使用键盘按键模拟跑步
设计思路
使用键盘的两个键(例如,左键和右键)来模拟左右腿的交替跑步。
假设每步步长为2米,则50次交替按键模拟跑完100米。