这是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 将在任务完成之前不会返回,这可能在所需的超时之后很长时间(甚至根本没有)。在指定时间后不返回的定时运行服务可能会激怒其调用者。
我的问题:
- 超时是什么意思?
- 什么是取消任务?