在“Java Concurrency in Practice Ch 7”(第142页,143页)一书中,我不太明白两种说法:
public void cancel() { interrupt(); },任何其他代码都可以调用它!!一个清晰,清晰,完整的代码说明了上面的两点,这就是我要找的。
发布于 2018-06-30 12:36:14
您询问的示例是在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当然可以提供具有重写的interrupt方法的ThreadFactory线程,如下所示:
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();
}https://stackoverflow.com/questions/51062363
复制相似问题