在“实践中的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()的进程,否则我认为中断功能不会卡住。

最佳答案

关键是timedRunr.run()返回之前不能返回。如果Runnable r忽略了它已被中断的事实,则r.run()的确可能返回得很晚。并不是interrupt调用被卡住(它可能几乎立即完成),而是该中断可以被其目标忽略,从而阻止timedRun直到run方法到达其自然结束(如果有的话)为止。

10-07 16:01