我有一个正在运行的线程:
public boolean shouldStopThread = false;
new Thread(new Runnable() {
@Override
public void run() {
try {
if(!shouldStopThread )
{
// Do my stop here
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
问题是当我将布尔值从false
更改为true
时,未在线程中检测到更改。
如何在线程中获取布尔值以检测更改?
答案 0 :(得分:3)
由于您的布尔值不 volatile
,因此无法保证在所有线程中立即更改。
如果您将其声明为volatile
,则可以保证每次更改该值时,都会在所有线程中看到它。
答案 1 :(得分:2)
您可以使用AtomicBoolean。它就像一个boolean
但它的值以原子方式更新
答案 2 :(得分:1)
你的线程只是检查是否有条件并停止它的执行。您应该在代码中等待或使用无限循环来检查条件:
while(!shouldStopThread )
{
// Do my stop here
}
或
Thread.sleep(1000);
if (!shouldStopThread )
{
// Do my stop here
}
在第二种情况下,您只需1秒即可将shouldStopThread
设置为true
值。
shouldStopThread
应为volatile
。