首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用线程每次检查(比如在后台运行),直到我的条件为真为止

如何使用线程每次检查(比如在后台运行),直到我的条件为真为止
EN

Stack Overflow用户
提问于 2017-05-08 18:28:00
回答 2查看 1K关注 0票数 1

我有这个代码样本。但是每次我运行它,它都不会等到我的条件是真的--,我需要这个Thread像一个东西,不断地寻找直到条件为真。

我的条件是:sum.contains(jLabel11.getText())

我需要Thread来工作,直到这个条件变为真为止。使用while(true)语句执行此操作,但有时它会成为程序的一个坏条件,因为它将持续打印和打印数千行(在我的例子中:“还不相等”),直到if语句中的条件是true为止。

但是我确实需要这个Thread一遍又一遍地查看,直到我在if语句中的条件是true,而没有在else condition中打印statement一千次,也没有在if condition中打印statement一千次,即使在if statement中的条件为真之后。但是我只需要打印statement I if语句一次就可以知道我的病情变成了true

代码语言:javascript
代码运行次数:0
运行
复制
new Thread() {
                public void run() {
                    try {
                        Thread.sleep(100);
                        if (sum.contains(jLabel11.getText())) {
                            System.out.println("Now equal");
                        } else {
                            System.out.println("Not equal yet");
                        }
                    } catch (InterruptedException ex) {
                        Logger.getLogger(AlarmClock.class.getName()).log(Level.SEVERE, null, ex);
                    }

                }

            }.start();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-08 18:48:40

解决方案看起来很简单,只需添加while(true),如果它在条件中中断执行,在时间和线程中退出,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
new Thread() {
    public void run() {
        try {
            while (true){
                if (sum.contains(jLabel11.getText())) {
                    System.out.println("Now equal");
                    break;
                }
            }
        } catch (InterruptedException ex) {
            Logger.getLogger(AlarmClock.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}.start();

现在,正如在其他答案中所解释的,这被称为自私的线程,它比监视器或其他类似事件的模式需要更多的资源。

在新体系结构(SMP =对称多处理器)上,自私的线程不是一个问题。但是,有些体系结构确实是一个问题(例如MPP大规模并行处理器体系结构)。

现在,关于你说的话:

它不会等到我的条件是真的我

似乎你的主线程在你正在创建的新线程之前就已经接近尾声了。

例如,如果单元测试(JUnit)中有该代码,则必须将一个thread.sleep放置到条件满足时,或者放置一个sum.contains(jLabel11.getText())来对其进行单元测试.

否则,主线程将完成,其所有子线程都将随之终止。

票数 1
EN

Stack Overflow用户

发布于 2017-05-08 18:33:25

那就这样做吧:

代码语言:javascript
代码运行次数:0
运行
复制
   while(!(sum.contains(jLabel11.getText())){
Thread.yield();
}
System.out.println("Now equal");
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43854819

复制
相关文章

相似问题

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