Темы: Ожидание занято - пустой цикл 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

Ответы на вопрос(2)

Ваш ответ на вопрос