java for循环 等待_java – 主题:忙等待 – 空循环
參見英文答案 > Is this starvation?????????????????????????????????????2個
在我們的大學課程中,我們學習了Threads并使用“Busy Waiting”方法作為在TrafficLight等待的汽車的示例.為此,我們構建了三個類:
> TrafficLight(實現Runnable)
>汽車(實現Runnable)
>主要
在我們的Main類中,我們啟動兩個Thread,一個是Car,另一個是TrafficLight. Car具有布爾屬性hasToWait.這個類中的run()方法的工作方式是,只要hasToWait == true,它就可以通過while循環工作.要更改此設置,我們在Car類中使用notifyCar()方法,TrafficLight使用該方法. TrafficLight中的run()方法運行Thread.sleep()來模擬一定的等待時間.
我教授的一切都很好,但最終我遇到了嚴重的問題.只要Car類中的while循環為空.當我輸入一個非空的System.out.println()時,它可以工作.但是如果Syso為空,則結果是不顯示Run of Run方法.
當TrafficLight中的Thread.sleep()為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();
}
}
問題出在哪兒?為什么它適用于我的教授而不是我的電腦?我使用JRE 1.7在Eclipse Juno中獲得了1:1的代碼
解決方法:
除了this other answer中所說的所有內容(只需用你的hasToWait代替完成該答案),代碼在添加println時開始工作的原因如下:
> println是一種同步方法;
>你在兩個線程中調用它;
>這會在兩個線程之間創建一個先發生的關系;
>因此,對子線程可以看到對布爾標志的寫入.
你可以說它開始大多是偶然的工作:你正在捎帶println中正在進行的同步.
標簽:java,eclipse,multithreading,busy-waiting
來源: https://codeday.me/bug/20190624/1280401.html
總結
以上是生活随笔為你收集整理的java for循环 等待_java – 主题:忙等待 – 空循环的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在php中源代码怎么查看,查看PHP C
- 下一篇: 民生VISA全币种信用卡申请条件及资料