java - 线程 : Busy Waiting - Empty While-Loop

标签 java eclipse multithreading busy-waiting

<分区>

在我们大学的类(class)中,我们学习了Threads,并使用了“Busy Waiting”方法作为一个CarTrafficLight<等待的例子。对于这个任务,我们构建了三个类:

  • TrafficLight(实现 Runnable)
  • Car(实现 Runnable)
  • 主要

在我们的 Main 类中,我们启动了两个 Thread,一个是 Car,另一个是 TrafficLightCar 具有 boolean 属性 hasToWait。此类中的 run() 方法的工作方式是,只要 hasToWait == true,它就会通过 while 循环工作。为了改变这一点,我们在 Car 类中使用了 notifyCar() 方法,该方法由 TrafficLight 使用。 TrafficLight中的run()方法运行一个Thread.sleep()来模拟一定时间的等待。

在我的教授那里一切正常,但最终我遇到了严重的问题。只要 Car 类中的 while 循环为空。当我输入 System.out.println() - not 为空时,它起作用了。但是如果Syso 为空,则结果是不显示Run 方法的Text。 当 TrafficLight 中的 Thread.sleep()0 时,它也有效。它适用于空的 while 循环。

这是我的代码:

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

}

问题出在哪里?为什么它适用于我的教授,但不适用于我的电脑?我使用 JRE 1.7

在我的 Eclipse Juno 中获得了代码 1:1

最佳答案

除了 this other answer 中所说的一切(只需将 hasToWait 替换为该答案中的 finished ),当您添加 println 时代码开始工作的原因如下:

  • println 是一个同步方法;
  • 你在两个线程中调用它;
  • 这会在两个线程之间创建一个发生在之前的关系;
  • 因此对 boolean 标志的写入对子线程可见。

您可以说它开始工作主要是偶然:您正在利用 println 中正在进行的同步。

关于java - 线程 : Busy Waiting - Empty While-Loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21306410/

相关文章:

java - Spring Boot Thymeleaf 3 外部 javascript 模板配置

java - Maven2 : Renaming provided dependecies at package phase?

java - geo_point 类型的不同格式?

java - Hazelcast 管理中心 com.hazelcast.webmonitor.Launcher

java - mvn 发布 :perform doesn't deploy release version

java - Eclipse E4 RCP 全局错误处理

java - 让 Netbeans 平台注释在 Eclipse 中工作

c# - Monitor.Pulse 丢失信号?

c# - 从后台 Worker 更新 ObservableCollection

c# - 使用 Entity Framework 的具有多个线程的单一上下文