我正在阅读 Java Concurrency in Practice 并遇到以下代码片段。
public static void timedRun(final Runnable r,
long timeout, TimeUnit unit)
throws InterruptedException {
class RethrowableTask implements Runnable {
private volatile Throwable t;
public void run() {
try { r.run(); }
catch (Throwable t) { this.t = t; }
}
void rethrow() {
if (t != null)
throw launderThrowable(t);
}
}
RethrowableTask task = new RethrowableTask();
final Thread taskThread = new Thread(task);
taskThread.start();
cancelExec.schedule(new Runnable() {
public void run() { taskThread.interrupt(); }
}, timeout, unit);
taskThread.join(unit.toMillis(timeout));
task.rethrow();
}
timedRun
方法用于在一个时间范围内运行任务 r
。这个特性可以通过 taskThread.join(unit.toMillis(timeout));
来实现。那么, 为什么我们需要预定的 taskThread.interrupt();
? 最佳答案
这不是真的。加入的时间限制只是 determines when the joining thread will give up waiting 。它不会影响被超时限制的线程。预定的 interrupt
告诉正在运行的线程在超时到期后自行关闭。如果它不存在,该线程将继续消耗资源。据推测,该方法的重点是防止这种情况发生。
关于Java 并发实践 “Listing 7.9. Interrupting a task in a dedicated thread.” 。预定 taskThread.interrupt() 的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59558077/