私は、チェックポイント付きのマラソンランナーを示すプログラムを作成したいと考えています。 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);
}
}}
は明らかにこれはほとんどの構造であると私は書くことを求めていないよので、私は原料の束を欠けています私のためのプログラム全体。 ここで私の主な問題は、ランナークラスの各インスタンスが何らかの形で他のインスタンスと通信し、すべてのランナーがチェックポイントに達するまでプログラム全体をスリープ状態にすることです。 「ポインタ」が役に立ちます。ありがとう!
あなたは 'CountDownLatch'を考えましたか? – MadProgrammer
聞いたことがない、私はそれをチェックします – OverflowingJava
あなたはForkJoinPoolを試してみるとよいでしょう。 invokeAllメソッドを見てみましょう。 –