Темы: Ожидание занято - пустой цикл while [duplicate]
На этот вопрос уже есть ответ здесь:
Это голод? 2 ответаВо время наших уроков в университете мы узнали оThreads
и использовал метод «Занятое ожидание», например,Car
в ожиданииTrafficLight
, Для этой задачи мы построим три класса:
TrafficLight (implements Runnable)
Car (implements Runnable)
Main
В нашемMain
класс мы начинаем дваThread
с, один изCar
и один изTrafficLight
,Car
имеет логический атрибутhasToWait
,run()
Метод в этом классе работает так, что он работает черезwhile
цикл до тех пор, покаhasToWait == true
, Чтобы изменить это, у нас естьnotifyCar()
метод вCar
класс, который используетсяTrafficLight
,run()
метод вTrafficLight
проходит черезThread.sleep()
смоделировать определенное время ожидания.
У моего профессора все отлично работает, но со временем у меня возникают серьезные проблемы. Покаwhile
петля вCar
класс пуст. Когда я положил вSystem.out.println()
- которыйне пусто, работает. Но если Syso пуст, результатом не будет отображение текстаRun
метод. Также это работает, когдаThread.sleep()
вTrafficLight
является0
, Чем работает с пустымwhile
петля.
Вот мой код:
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();
}
}
В чем проблема? Почему это работает на моих профессионалов, но не на моем компьютере? Я получил код 1: 1 в моем Eclipse Juno, используяJRE 1.7