나는 체크 포인트가있는 마라톤 선수를 보여주는 프로그램을 만들고 싶습니다. 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 메소드를 살펴보십시오. –