在“实践中的Java并发性”一书中,有一条语句-> if the task is not responsive to interruption, timedRun will not return until the task finishes, which may be long after the desired timeout
private static final ScheduledExecutorService cancelExec = ...;
public static void timedRun(Runnable r,
long timeout, TimeUnit unit) {
final Thread taskThread = Thread.currentThread();
cancelExec.schedule(new Runnable() {
public void run() { taskThread.interrupt(); }
}, timeout, unit);
r.run();
}
这是否意味着interrupt()函数可能会卡住?可能导致interrupt()卡住的原因。它只是设置目标线程的isInterrupted标志。我预见除非并且直到任何进程可能饿死正在调用interrupt()的进程,否则我认为中断功能不会卡住。
最佳答案
关键是timedRun
在r.run()
返回之前不能返回。如果Runnable r
忽略了它已被中断的事实,则r.run()
的确可能返回得很晚。并不是interrupt
调用被卡住(它可能几乎立即完成),而是该中断可以被其目标忽略,从而阻止timedRun
直到run
方法到达其自然结束(如果有的话)为止。