首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java - while( true )循环不检查,条件是否为真,如果差语句丢失

Java - while( true )循环不检查,条件是否为真,如果差语句丢失
EN

Stack Overflow用户
提问于 2022-09-24 16:05:59
回答 2查看 53关注 0票数 0
代码语言:javascript
复制
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");
            }            
        }
    }

在我的主要课程中,我有两个值为false的公共静态布尔值。

如果两个布尔值都被另一个类设置为true,则会不断地检查while(true)循环。

但是,如果这两个条件都被设置为true,则不会发生任何事情。

如果向like循环添加了一个The语句,则like循环只起作用:

代码语言:javascript
复制
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");
            }            
        }
    }

所以问题肯定是that循环。

将条件设置为true的类工作非常好。我已经通过删除while循环来测试这个问题,并在布尔值发生变化后打印它们的值。

我不明白,为什么第一段代码没有做它应该做的事情,而另一段添加了else语句的代码却做到了这一点。

复制代码以进行测试:

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-24 16:13:33

JVM将优化您的代码,因为主线程中的值从未更改过。线程之间没有同步。在读取和写入变量时,需要使用synchronized块,或者将它们标记为volatile。每次访问volatile时,都会强制从内存中重新读取它们。

票数 4
EN

Stack Overflow用户

发布于 2022-09-24 16:17:27

我认为这不是您的循环,而是您试图访问主方法中的静态变量。解决方案是在main类中实例化一个main对象。

代码语言:javascript
复制
Main mainObj = new Main();   

那你的时候看起来就像

代码语言:javascript
复制
while(true){
     if(mainObj.isToggled && mainObj.isClicking){
            System.out.println("Running");
        }
        else{
            System.out.println("Idle");
        } 
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73838679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档