我想创建一个程序,说明与检查点的马拉松选手。创建5个跑步者,并随机抽出时间到达第一个检查点。跑步者必须停在检查站,直到所有其他跑步者都到达检查站。有2个检查站和终点线。如何暂停Runnable直到另一个相同类型的任务完成?
这里是我认为将是实现这一目标的最佳途径一些基本代码:
public class Main {
public static void main(String[] args) {
int i = 1;
Runner[] runners = new Runner[5];
//Create 5 Runners
for (Runner runner : runners) {
runner = new Runner(i++);
runner.run();
}
//Wait for runners to arrive at 1st checkpoint
for (Runner runner : runners) {
runner.arrivedAt1stCheckpoint();
}
//Wait for runenrs to arrive at 2nd checkpoint
for (Runner runner : runners) {
runner.arrivedAt2ndCheckpoint();
}
//Wait for runners to finish race
for (Runner runner : runners) {
runner.finishedRace();
}
}}
public class Runner implements Runnable {
public final int runnerID;
Random randomGenerator = new Random();
public Runner(int i) {
this.runnerID = i;
}
@Override
public void run() {
System.out.printf("Runner %d exists\n", runnerID);
}
public boolean arrivedAt1stCheckpoint() {
sleepThread();
System.out.printf("Runner %d arrived at 1st checkpoint\n", runnerID);
return true;
}
public boolean arrivedAt2ndCheckpoint() {
System.out.printf("Runner %d arrived at 2nd checkpoint\n", runnerID);
sleepThread();
return true;
}
public boolean finishedRace() {
System.out.printf("Runner %d finished race\n", runnerID);
sleepThread();
return true;
}
private void sleepThread() {
try {
Thread.sleep(randomGenerator.nextInt(1000));
} catch (InterruptedException ex) {
Logger.getLogger(Runner.class.getName()).log(Level.SEVERE, null, ex);
}
}}
这显然是勉强结构,我错过了一堆的东西,所以我不要求写整个程序对我来说。 我在这里遇到的主要问题是让Runner类的每个实例以某种方式与其他实例进行通信,并且休眠整个程序,直到所有Runners达到检查点。 任何“指针”将有所帮助,谢谢!
你有没有考虑过'CountDownLatch'? – MadProgrammer
从来没有听说过,我会检查出来 – OverflowingJava
你可能想尝试一个ForkJoinPool。看看invokeAll方法。 –