Tematy: Busy Waiting - Empty While-Loop [duplikat]
To pytanie ma już tutaj odpowiedź:
Czy to głód? 2 odpowiedziPodczas naszych lekcji na uniwersytecie dowiedzieliśmy się oThreads
i użyłem metody „Busy Waiting” na przykładCar
czekam naTrafficLight
. Do tego zadania budujemy trzy klasy:
TrafficLight (implements Runnable)
Car (implements Runnable)
Main
W naszymMain
klasa zaczynamy od dwóchThread
s, jeden zCar
i jeden zTrafficLight
. TheCar
ma atrybut booleanhasToWait
. Therun()
metoda w tej klasie działa tak, że działa poprzezwhile
pętla tak długo, jakhasToWait == true
. Aby to zmienić, mamynotifyCar()
metoda wCar
klasa, która jest używana przezTrafficLight
. Therun()
metoda wTrafficLight
przebiega przezThread.sleep()
symulować pewien czas oczekiwania.
Wszystko działa dobrze w moim Profie, ale w końcu mam z tym poważne problemy. Tak długo jakwhile
pętla wCar
klasa jest pusta. Kiedy włożyłemSystem.out.println()
- który jestnie pusty, to działa. Ale jeśli Syso jest puste, wynikiem nie jest wyświetlanie tekstuRun
metoda. Działa również, gdyThread.sleep()
wTrafficLight
jest0
. Następnie działa z pustymwhile
pętla.
Oto mój kod:
Car.java:package trafficlight;
public class Car implements Runnable {
private boolean hasToWait = true;
public void run() {
this.crossTrafficLight();
}
public void crossTrafficLight() {
while(hasToWait){ for(int i = 0; i<20; i++){System.out.println("123");}} // Busy waiting
System.out.println("Auto fährt über Ampel");
}
public void notifyCar() {
this.hasToWait = false;
System.out.println("Test");
}
}
TrafficLight.java:package trafficlight;
public class TrafficLight implements Runnable {
private Car car;
public TrafficLight(Car car) {
this.car = car;
}
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.car.notifyCar();
}
}
Main.java:package trafficlight;
public class Main {
public static void main(String[] args){
Car car = new Car();
TrafficLight tl = new TrafficLight(car);
new Thread(car).start();
new Thread(tl).start();
}
}
Gdzie jest problem? Dlaczego to działa na moich profesorach, ale nie na moim komputerze? Dostałem kod 1: 1 w moim Eclipse Juno, używającJRE 1.7