簡體   English   中英

Java - while(true) 循環不檢查,如果條件為真,如果缺少 else 語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM