我有实现Runnable的类:
public class Abc implements Runnable{
public synchronized void run(){
while(!(Thread.currentThread().isInterrupted() || someCondition())){
doSomething();
try{
this.wait(SOME_TIME);
} catch(InterruptedException ex){
logger.error("Ex",ex);
Thread.currentThread.interrupt();
}
}}}
在提交到线程池后,我想取消它,并中断它。
futureTask.cancel(true);
但是今天我的Runnable
对象停止了接收中断。我已注销中断状态: false。不抛出InterruptedException
。有什么建议吗?出什么问题了?
发布于 2011-05-09 22:00:31
已解决
这实际上是非常棘手的竞争条件。我一直在从gui线程启动任务,并从网络阅读器线程取消它。我不能解释为什么log4j不显示记录器,但是更好的线程控制解决了我的问题。你的回答帮助我找到了一个解决问题的想法,谢谢。
当昨天某些东西工作但今天不起作用时-可能是它的竞争条件或死锁。:-)
发布于 2011-04-28 15:23:04
我的猜测是中断被doSomething占用了,或者doSomething被占用(没有返回)
在这样的循环中使用wait()向我表明,您有一个更适合使用并发库的控制流。你能提供更多关于你正在等待的细节吗?
顺便说一句,如果你把try/cath移到循环之外,它将会简化它。
发布于 2011-04-28 15:28:02
首先,您的代码片段甚至不能编译:您缺少大括号,Thread.currentThread是一个方法而不是一个实例变量。那么,您是否在doSomething方法中调用Thread.interrupted()?如果是:它清除线程的中断状态,这样等待就不会被中断,currentThread().isInterrupted()将返回false。
您也不需要在while子句中重新检查中断状态,也不需要在线程被迭代时重新中断它。这看起来更好(并且捕获了你的doSomething可能抛出的异常):
public synchronized void run() {
try {
while (!someCondition()) {
doSomething();
wait(SOME_TIME);
}
} catch (InterruptedException ie) {
logger.error(ie);
} catch (Exception e) {
logger.error(e);
}
}
@Peter:移动try/catch,这绝对是个好建议!
https://stackoverflow.com/questions/5814677
复制相似问题