2

这是Java Concurrency in Practice一书中的片段:

//Scheduling an interrupt on a borrowed thread. Don’t do this.

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();
}

作者说:

这是一种非常简单的方法,但它违反了规则:在中断线程之前,您应该知道线程的中断策略。由于 timedRun 可以从任意线程调用,它无法知道调用线程的中断策略。如果任务在 timeout 之前完成,则中断调用 timedRun 的线程的取消任务可能会在 timedRun 返回其调用者后关闭。我们不知道发生这种情况时会运行什么代码,但结果不会很好。(通过使用 schedule 返回的 ScheduledFuture 取消取消任务来消除这种风险是可能的,但非常棘手。)

此外,如果任务对中断没有响应,则 timedRun 将在任务完成之前不会返回,这可能在所需的超时之后很长时间(甚至根本没有)。在指定时间后不返回的定时运行服务可能会激怒其调用者。

我的问题:

  1. 超时是什么意思?
  2. 什么是取消任务
4

1 回答 1

3

超时意味着taskThread在任务被中断之前有一个分配的时间间隔来运行任务。取消任务是执行中断的专用任务(在单独的线程上)。

这里的危险是:

  • 该代码正在中断线程而不是取消任务。被中断的线程可能是线程池的一部分,并且可能已经完成了任务并且正在执行一些完全不同的任务。

  • 被中断的任务可能不会适当地使用中断作为完成其工​​作的指示器,或者如果可能正在执行诸如阻塞 I/O 之类的事情,它无法检查中断状态,因此通常不能保证超时是有效的。

于 2015-10-22T02:53:16.487 回答