Java 为什么我们不在借用的线程上安排一个中断呢?
以下是《Java并发实践》一书中的片段: 作者说: 这是一个看似简单的方法,但它违反了规则:你 在中断线程之前,应该知道线程的中断策略。 因为timedRun可以从任意线程调用,所以它无法知道 调用线程的中断策略如果任务在 超时,取消任务,该任务中断 timedRun被调用,可以在timedRun返回其 呼叫者我们不知道发生这种情况时会运行什么代码,但是 结果不会好的。(这是可能的,但出人意料的棘手 通过使用ScheduledFuture返回的ScheduledFuture消除此风险 以取消取消任务。) 此外,如果任务对中断没有响应,timedRun将 直到任务完成后才返回,这可能在任务结束后很久 期望的超时(甚至根本不需要)。一个定时运行服务,它不会 在指定时间后返回很可能会刺激其性能 来电者 我的问题是:Java 为什么我们不在借用的线程上安排一个中断呢?,java,multithreading,timeout,cancellation,interruption,Java,Multithreading,Timeout,Cancellation,Interruption,以下是《Java并发实践》一书中的片段: 作者说: 这是一个看似简单的方法,但它违反了规则:你 在中断线程之前,应该知道线程的中断策略。 因为timedRun可以从任意线程调用,所以它无法知道 调用线程的中断策略如果任务在 超时,取消任务,该任务中断 timedRun被调用,可以在timedRun返回其 呼叫者我们不知道发生这种情况时会运行什么代码,但是 结果不会好的。(这是可能的,但出人意料的棘手 通过使用ScheduledFuture返回的ScheduledFuture消除此风险 以取消取消
超时意味着线程在被中断之前有一个分配的时间间隔供线程运行。取消任务是执行中断的专用任务(在单独的线程上) 这里的危险是:
- 代码是中断线程而不是取消任务。被中断的线程可能是线程池的一部分,并且可能已经完成了任务并且处于一些完全不同的任务的中间。
- 被中断的任务可能没有适当地将中断用作完成其工作的指示器,或者可能正在执行诸如阻塞I/O之类的操作,而无法检查中断状态,因此通常无法保证超时有效
//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();
}