[英]Java - while(true) loop not checking, if condition is true, if the else statement is missing
public class Main {
public static boolean isToggled = false;
public static boolean isClicking = false;
public static void main(String[] args){
while(true){
if(Main.isToggled && Main.isClicking){
System.out.println("Running");
}
}
}
我的主 class 中有兩個公共 static 布爾值,其值為 false。
如果兩個布爾值都設置為 true,while(true) 循環將不斷檢查另一個 class。
但是,如果兩個條件都設置為 true,則不會發生任何事情。
只有在像這樣添加 else 語句時,while 循環才有效:
public class Main {
public static boolean isToggled = false;
public static boolean isClicking = false;
public static void main(String[] args){
while(true){
if(Main.isToggled && Main.isClicking){
System.out.println("Running");
}
else{
System.out.println("Idle");
}
}
}
所以問題肯定是while循環。
將條件設置為 true 的 class 工作得非常好。 我已經通過刪除 while 循環進行了測試,並在布爾值更改后僅打印它們的值。
我不明白,為什么第一個代碼沒有做它應該做的事情,而另一個添加了 else 語句的代碼卻做了。
復制代碼進行測試:
public class Main {
public static boolean isToggled = false;
public static boolean isClicking = false;
public static void main(String[] args) {
Thread changeBoolsT = new Thread(new Runnable() {
@Override
public void run() {
changeBools();
}
});
changeBoolsT.start();
while(true){
if(isToggled && isClicking){
System.out.println("OK");
break;
}
else{ // Remove this else statement
System.out.println("Waiting");
}
}
}
public static void changeBools(){
try{
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
isToggled = true;
isClicking = true;
}
}
JVM 將優化您的代碼,因為您的主線程中的值永遠不會改變。 線程之間沒有同步發生。 您需要在讀取和寫入變量時使用synchronized
塊或將它們標記為volatile
。 volatile
將強制每次訪問它們時從 memory 重新讀取它們。
我不認為它是你的循環,它是你試圖在你的主要方法中訪問 static 變量。 一個解決方案是在你的主 class 中實例化一個主 object。
Main mainObj = new Main();
那么你的 while 看起來像
while(true){
if(mainObj.isToggled && mainObj.isClicking){
System.out.println("Running");
}
else{
System.out.println("Idle");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.