Tematy: Busy Waiting - Empty While-Loop [duplikat]

To pytanie ma już tutaj odpowiedź:

Czy to głód? 2 odpowiedzi

Podczas 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óchThreads, jeden zCari 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

questionAnswers(2)

yourAnswerToTheQuestion