在Java Concurrency in Practice
第7章第142、143页中,我不太理解2条陈述:
public void cancel() { interrupt(); }
,其他任何代码都可以调用它!我正在寻找一个清晰,清晰,完整的代码来说明以上两点。
答案 0 :(得分:1)
JDK本身提供了您要询问的示例:)。看看ThreadPoolExecutor::shutdown
public void shutdown() {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
checkShutdownAccess();
advanceRunState(SHUTDOWN);
interruptIdleWorkers();
onShutdown(); // hook for ScheduledThreadPoolExecutor
} finally {
mainLock.unlock();
}
tryTerminate();
}
1 ThreadPoolExecutor
的线程(ThreadPoolExecutor::Worker::thread
)仅由ThreadPoolExecutor
实例拥有。
ThreadPoolExecutor::shutdown
没有公开有关其运行的线程以及如何关闭线程的任何详细信息。它所保证的就是
启动有序关闭,其中先前提交的任务位于 执行,但不会接受新任务。
2 当然,您可以为ThreadFactory
发出的线程提供覆盖的interrupt
方法,如下所示:
public void BadThread extends Thread{
public BadThread(Runnable r){
super(r);
}
@Override
public void interrupt(){
throw new IllegalArgumentException();
}
}
但这将是一场灾难,因为ThreadPoolExecutor
不了解您的中断策略(抛出IllegalArgumentException
)。并且根据其实现interruptIdleWorkers
方法或runWorker
(当发现当前状态为SHUTDOWN
,但尚未中断工作程序时)仅在中断工作程序时失败。
因此以下程序 可能 (检索任务和关闭之间存在某些竞争)永远不会终止:
public static void main(String[] args) {
ThreadFactory tf = BadThread::new;
ExecutorService es = Executors.newFixedThreadPool(8, tf);
es.submit(() -> System.out.println("Test"));
es.submit(() -> System.out.println("Test")); // I added this entry because of
// shutdown() and runWorker() are
// kind of racy and
es.shutdown();
}