Threads: Besetztes Warten - Leere While-Schleife [duplizieren]

Diese Frage hat hier bereits eine Antwort:

Ist das Hunger? 2 Antworten

Während unseres Unterrichts an der Universität haben wir davon erfahrenThreads und verwendete die "Busy Waiting" -Methode für ein Beispiel von aCar Warten an einemTrafficLight. Für diese Aufgabe bauen wir drei Klassen:

TrafficLight (implements Runnable)Car (implements Runnable)Main

In unsererMain Klasse fangen wir zu zweit anThreads, einer vonCarund einer vonTrafficLight. DasCar hat das boolesche AttributhasToWait. Dasrun() Methode in dieser Klasse funktioniert so, dass sie durch einwhile Schleife so lange wiehasToWait == true. Um dies zu ändern, haben wir dienotifyCar() Methode in derCar Klasse, die von der verwendet wirdTrafficLight. Dasrun() Methode inTrafficLight läuft durch eineThread.sleep() eine bestimmte Wartezeit zu simulieren.

Alles funktioniert gut bei meinem Professor, aber irgendwann habe ich ernsthafte Probleme damit. Solange diewhile Schleife in derCar Klasse ist leer. Wenn ich aSystem.out.println() - welches istnicht leer, es funktioniert. Aber wenn das Syso leer ist, wird der Text des Syso nicht angezeigtRun Methode. Es funktioniert auch, wenn dieThread.sleep() imTrafficLight ist0. Dann klappt es mit einem leerenwhile Schleife.

Hier ist mein Code:

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();
    }

}

Wo ist das Problem? Warum funktioniert das bei meinen Profis, aber nicht bei meinem Computer? Ich habe den Code 1: 1 in meiner Eclipse Juno mitJRE 1.7

Antworten auf die Frage(2)

Ihre Antwort auf die Frage