java无论如何都有一个线程来捕获中断异常,而不仅仅是放置时间。单元秒。睡觉
我有一个线程,在其内部进行数据库调用,有时会挂起,通常超时应该在客户端库中处理,但在这种情况下,客户端库不能正确处理它,因此我必须添加一个额外的计划作业,以取消正在进行数据库调用的线程,如果它需要太长时间来避免背压
现在我正在终止线程
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;
}
}
# 1 楼答案
这不会中断线程。它只检查线程是否在睡眠之前或睡眠期间被中断,如果被中断,则抛出
InterruptedException
如果要中断线程,请使用:
如果要检查当前线程是否已中断,请使用:
请注意,这会清除此中断状态:使用
Thread.currentThread().isInterrupted()
进行检查而不清除状态# 2 楼答案
从Java 9开始,您可以使用CompletableFuture.orTimeout: