我有一个线程,在它的内部有时会挂起数据库调用,通常应该在客户端库中处理超时,但是在这种情况下,客户端库无法正确处理它,因此我必须添加一个额外的计划作业如果花费太长时间以避免背压,则取消正在进行db调用的线程。
现在我要通过
终止线程final Future handler = executor.submit(new MyTask());
executor2.schedule(new Runnable(){
public void run(){
handler.cancel(true);
}
}, 3, TimeUnit.SECONDS);
有没有TimeUnit.MILLISECONDS.sleep(1);
来中断线程的正确方法吗?增加睡眠似乎很困难
@Override
public Boolean call() {
try {
// Sometimes hangs
db.call();
// Need it to be here to call InterruptedException
TimeUnit.MILLISECONDS.sleep(1);
return true;
} catch (InterruptedException e) {
return false;
}
}
答案 0 :(得分:1)
在没有
TimeUnit.MILLISECONDS.sleep(1);
的情况下是否有适当的方法来中断线程?
这不会中断线程。它仅在睡眠之前或睡眠期间检查线程是否已被中断,并抛出InterruptedException
。
如果要中断线程,请使用:
t.interrupt();
如果要检查当前线程是否已中断,请使用:
Thread.interrupted()
请注意,这将清除此中断状态:使用Thread.currentThread().isInterrupted()
进行检查而不清除该状态。
答案 1 :(得分:0)
从Java 9开始,您可以使用CompletableFuture.orTimeout:
Future<?> handler = CompletableFuture.runAsync(new MyTask())
.orTimeout(3, TimeUnit.SECONDS);