Threads: Besetztes Warten - Leere While-Schleife [duplizieren]
Diese Frage hat hier bereits eine Antwort:
Ist das Hunger? 2 AntwortenWä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 anThread
s, einer vonCar
und 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