我有这个代码示例。但每次我运行它,它不会等到我的条件成立
我需要这个Thread
就像是在条件成真之前不断寻找的东西。
我的条件是: sum.contains(jLabel11.getText())
我需要Thread
才能工作,直到这个条件成立。
使用while(true)
语句执行此操作,但有时它会对程序造成不良影响,因为它会继续打印和打印数千行(在我的情况下:“ Not equal yet ” )直到if
语句中的条件为true
但我真的需要这个Thread
一遍又一遍地观察,直到if
语句中的条件为true
,而不在statement
中打印else condition
即使在我statement
内的条件成立后,也会在if condition
千次内打印if statement
一千次。但是我需要在statement
语句一次才能知道我的情况变为if
true
答案 0 :(得分:1)
虽然你可以像Rogue所说的那样做,但它几乎总是一个糟糕的主意。在拥有一个线程" spin"它浪费了很多的计算能力。 (即坐在循环中连续测试条件)。它也没有提供一个特别好的保证线程注意"立即" (或在任何给定的时间范围内)当条件成立时。 (您需要一个实时线程系统来提供这种保证。)
您将获得至少同样良好的响应能力,并且无需占用处理器,使用显示器。在java中,每个对象都可能是一个监视器。查看JavaDoc notify
和wait
作为一个很好的起点。
这是一个简单的模式:你创建一个监视器,你的后台线程在那个监视器上等待,任何可能影响待测条件的操作都会在监视器上调用notify
。当你被唤醒时,你的线程会检查这个状况,然后做其工作或重新进入睡眠状态(再次wait
)。
答案 1 :(得分:0)
解决方案看起来很简单,只需添加while(true),如果它进入条件,则会执行中断并执行出线程,如下所示:
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 = Symmetric Multi处理器)上,自私线程不是问题......但是有一些架构可能确实存在问题(例如MPP Massive并行处理器架构)
现在,关于你所说的陈述:
它不会等到我的状况为真我
在您创建这个新线程之前,您的主要线程似乎已到达终点......
例如,如果你在单元测试(JUnit)中有那个代码,你必须放一个thread.sleep来等待条件满足,或者模拟sum.contains(jLabel11.getText())来进行单元测试它...
如果没有,主线程将完成,其所有子线程将终止它。
答案 2 :(得分:-1)
然后这样做:
while(!(sum.contains(jLabel11.getText())){
Thread.yield();
}
System.out.println("Now equal");