Moin moin werte Community,
in der FH arbeiten wir derzeit an Nebenläufigkeit und hatten dazu heute ein kleines Beispiel von "Busy Waiting"
Doch da gibt es ein kleines Problem. Die unten abgebildete Klasse Car soll solange warten, wie der Wert "hasToWait" true ist. Durch "TrafficLight" wird ein Car-Objekt instanziert und über die dort enthaltene NotifyCar-Methode soll das Attribut "hasToWait" geändert werden und das Auto weiterfahren.
Für eine Wartezeit zum Sehen des Effekts haben wir einen Thread.Sleep implementiert und hier wirds merkwürdig.
Bei allen sleep()-Werten über 0 bekomm ich nicht die Ausgabe "Auto fährt weiter". Wenn ich allerdings in der While-Schleife der crossTrafficLight()-Methode editiere, sieht das anders aus.
Wenn während der While-Schleife eine System.out.println("...") Line jedes Mal während des Thread.sleeps ausgeführt wird, gibt es die gewünschte Ausgabe. Ich dachte also, eine for-Schleife dazwischen packen (so seltsam wie das Problem schon ist). Da gab es wieder keine Ausgabe. Wenn ich zur for-Schleife aber jedes Mal eine Syso-Line ausgebe, geht es wieder?!
Bei meinem Prof lief im Übrigen alles ohne For-Schleife, die While-Schleife blieb leer.
Wo liegt der Fehler?
Car-Klasse
TrafficLight-Klasse
Main-Klasse
in der FH arbeiten wir derzeit an Nebenläufigkeit und hatten dazu heute ein kleines Beispiel von "Busy Waiting"
Doch da gibt es ein kleines Problem. Die unten abgebildete Klasse Car soll solange warten, wie der Wert "hasToWait" true ist. Durch "TrafficLight" wird ein Car-Objekt instanziert und über die dort enthaltene NotifyCar-Methode soll das Attribut "hasToWait" geändert werden und das Auto weiterfahren.
Für eine Wartezeit zum Sehen des Effekts haben wir einen Thread.Sleep implementiert und hier wirds merkwürdig.
Bei allen sleep()-Werten über 0 bekomm ich nicht die Ausgabe "Auto fährt weiter". Wenn ich allerdings in der While-Schleife der crossTrafficLight()-Methode editiere, sieht das anders aus.
Wenn während der While-Schleife eine System.out.println("...") Line jedes Mal während des Thread.sleeps ausgeführt wird, gibt es die gewünschte Ausgabe. Ich dachte also, eine for-Schleife dazwischen packen (so seltsam wie das Problem schon ist). Da gab es wieder keine Ausgabe. Wenn ich zur for-Schleife aber jedes Mal eine Syso-Line ausgebe, geht es wieder?!
Bei meinem Prof lief im Übrigen alles ohne For-Schleife, die While-Schleife blieb leer.
Wo liegt der Fehler?
Car-Klasse
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");
}
}
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();
}
}
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();
}
}