下面是书中Java并发的代码片段
//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,所以它无法知道调用线程的中断策略。如果任务在超时之前完成,中断调用timedRun的线程的取消任务可能会在timedRun返回给调用者之后消失。我们不知道当这种情况发生时将运行哪些代码,但结果并不好。(通过使用计划返回的ScheduledFuture来取消取消任务,消除这一风险是可能的,但却是令人惊讶的棘手。) 此外,如果任务对中断没有响应,timedRun将在任务完成之前不会返回,这可能是在所需的超时之后很长时间(甚至根本没有)。在指定时间之后不返回的定时运行服务可能会激怒其调用方。
我的问题:
发布于 2015-10-22 02:53:16
超时意味着taskThread有一个分配的时间间隔来在任务被中断之前运行它。取消任务是执行中断的专用任务(在单独的线程上)。
这里的危险是:
https://stackoverflow.com/questions/33272581
复制相似问题