在大学的课程中,我们了解了
在我的教授那里一切顺利,但最终我遇到了严重的问题。只要
以下是我的代码:
Threads
并以等待TrafficLight
的Car
的“忙等待”方法为例。为此,我们构建了三个类:
-
TrafficLight(实现Runnable)
-
Car(实现Runnable)
-
Main
Main
类中,启动两个线程,一个是Car
,另一个是TrafficLight
。 Car
具有布尔属性hasToWait
。该类中的run()
方法按照如下方式工作:只要hasToWait == true
,它就会通过while
循环工作。为了改变这一点,我们在Car
类中使用notifyCar()
方法,该方法由TrafficLight
使用。 TrafficLight
中的run()
方法通过Thread.sleep()
运行来模拟等待的时间。在我的教授那里一切顺利,但最终我遇到了严重的问题。只要
Car
类中的while
循环为空,我就有问题。当我放入一个非空的System.out.println()
时,它可以工作。但是,如果Syso为空,则结果是不显示Run
方法的文本。当TrafficLight
中的Thread.sleep()
为0
时,它也可以与空的while
循环一起使用。以下是我的代码:
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();
}
}
问题出在哪里?为什么它在我的教授电脑上可以运行,但是在我的电脑上不行?我已经在Eclipse Juno中使用了1:1的代码,使用了JRE 1.7