【发布时间】:2014-02-11 14:45:58
【问题描述】:
我遇到了停止我正在创建的一些线程的问题。
代码
private volatile int status = STOPPED;
@Override
public void run() {
logger.info("Thread with ID : " + id);
status = RUNNING;
while (status == RUNNING) {
try {
execute(); //<-- very intensive
status = IDLE;
Thread.sleep(DYNAMIC_VALUE);
} catch (Exception e) {
logger.info("An exception occured in thread with ID : " + id);
e.printStackTrace();
} finally {
if(status == IDLE)
status = RUNNING;
}
}
logger.info("Thread with ID : " + id + " just exited.");
}
@Override
public void stop() {
status = STOPPED;
logger.info("Thread with ID: " + id + " is stopped.");
}
有时当我调用stop() 时,并非所有线程都停止了。
这从来没有被称为
logger.info("Thread with ID : " + id + " just exited.");
相反,execute() 内的日志消息重复出现,因此它没有得到
一路上卡在某个地方。就像status 的值没有改变一样。
execute() 方法是重量级的。它做了很多事情,比如更新 数据库和调用 Web 服务。
你有没有发现我停止线程的方式有什么问题,或者我应该看看 更深?我是否涵盖了这方面?
【问题讨论】:
标签: java multithreading volatile