我有实现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
不会被抛出。有什么建议是错的吗?
答案 0 :(得分:1)
我的猜测是doSomething消耗了中断,或者doSomething被绑定了(没有返回)
在这样的循环中使用wait()告诉我你有一个更适合使用Concurrency库的控制流。你能否提供一些关于你在等什么的更多细节?
BTW,如果你将try / cath移动到循环外部,它会简化它。
答案 1 :(得分:0)
首先你的代码片段甚至没有编译:你缺少大括号,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:移动尝试/捕捉,这绝对是一个很好的建议!
答案 2 :(得分:0)
解决
这实际上是非常棘手的竞争条件。我一直在从gui线程开始任务并从网络阅读器线程中取消它。我无法解释为什么log4j没有显示记录器,但更好的线程控制解决了我的问题。你的回答帮助我找到解决问题的想法,谢谢。
当一些事情在昨天工作但今天没有 - 可能是它的竞争状态或死锁。 : - )强>