Я хотел бы создать программу, которая иллюстрирует бегунов марафона с контрольными точками. 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 каким-то образом взаимодействовал с другими экземплярами и спал всю программу до тех пор, пока все Бегуны не достигнут контрольных точек. Любые «указатели» помогут, спасибо!
Вы считаете 'CountDownLatch'? – MadProgrammer
Никогда не слышал об этом, я проверю его – OverflowingJava
Возможно, вы захотите попробовать ForkJoinPool. Взгляните на метод invokeAll. –