首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程中断- JCIP

线程中断- JCIP
EN

Stack Overflow用户
提问于 2018-06-27 12:04:45
回答 1查看 59关注 0票数 0

在“Java Concurrency in Practice Ch 7”(第142页,143页)一书中,我不太明白两种说法:

  1. “线程应由其所有者中断”。-However,在p 141上,一个扩展线程的类已经公开了public void cancel() { interrupt(); },任何其他代码都可以调用它!!
  2. “只有实现线程中断策略的代码才能吞下中断请求。”

一个清晰,清晰,完整的代码说明了上面的两点,这就是我要找的。

EN

回答 1

Stack Overflow用户

发布于 2018-06-30 12:36:14

您询问的示例是在JDK本身中提供的:)。看看ThreadPoolExecutor::shutdown

代码语言:javascript
复制
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线程,如下所示:

代码语言:javascript
复制
public void BadThread extends Thread{
    public BadThread(Runnable r){
        super(r);
    }

    @Override
    public void interrupt(){
        throw new IllegalArgumentException();
    }
}

但这将是一场灾难,因为ThreadPoolExecutor不知道您的中断策略(抛出IllegalArgumentException)。根据它的实现,interruptIdleWorkers方法或runWorker (当发现当前状态为SHUTDOWN,但工作人员尚未被中断时)在中断工作人员时就会失败。

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

代码语言:javascript
复制
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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51062363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档