gpt4 book ai didi

java - 线程中断-JCIP

转载 作者:行者123 更新时间:2023-12-02 11:04:40 25 4
gpt4 key购买 nike

书中Java Concurrency in Practice第7章,第142、143页,我不太明白2句话:

  1. “线程应该被其所有者中断”。-然而,在第 141 页,一个扩展 Thread 的类已经暴露 public void cancel() { interrupt(); }这可以由任何其他代码调用!!
  2. “只有实现线程中断策略的代码才可能吞下中断请求。”

我正在寻找清晰、清晰且完整的代码来说明上述两点。

最佳答案

您所询问的示例是在 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 不会公开有关其运行的线程以及如何关闭它们的任何详细信息。它所保证的是

Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted.

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,但工作线程尚未中断时)在以下情况下会失败:打扰 worker 。

因此以下程序可能(检索任务和关闭之间存在一些竞争)永远不会终止:

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();
}

关于java - 线程中断-JCIP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51062363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com