代码之家  ›  专栏  ›  技术社区  ›  rouble

当ExecutorService关闭()时,运行/阻止的可运行文件会发生什么情况?

  •  3
  • rouble  · 技术社区  · 15 年前

    我张贴了一张 question 关于今天的线程模式,几乎所有人都建议我研究一下ExecutorService。

    当我调查遗嘱执行人服务时,我想我遗漏了一些东西。如果服务有一个正在运行或被阻塞的线程,并且有人调用ExecutorService.Shutdown(),会发生什么情况?正在运行或阻塞的线程会发生什么情况?

    ExecutorService是否在终止前等待这些线程完成?

    我之所以这么问是因为很久以前我在爪哇涉猎时,他们不喜欢Toel.Stand(),而且我记得停止线程的正确方法是使用SePaPres并在必要时扩展线程:

    public void run () {
        while (!this.exit) {
            try {
                block();
                //do something
            } catch (InterruptedException ie) {
            }
        }
    }
    
    public void stop () {
        this.exit = true;
    
        if (this.thread != null) {
            this.thread.interrupt();
            this.thread = null;
        }
    }
    

    ExecutorService如何处理正在运行的线程?

    2 回复  |  直到 15 年前
        1
  •  9
  •   BalusC    15 年前

    ExecutorService#shutdown() :

    启动有序关闭,在该关闭中执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他效果。

    所以它将等待这些线程完成。

    另一种选择是 ExecutorService#shutdownNow()

    尝试停止所有正在执行的任务,停止正在等待的任务的处理,并返回正在等待执行的任务的列表。

    除了尽最大努力尝试停止处理活动执行的任务之外,没有任何保证。例如,典型的实现将通过取消 Thread.interrupt() 因此,任何未能响应中断的任务都可能永远不会终止。

    你只需要听 Thread#isInterrupted() while 环内 run() 你自己。

        2
  •  1
  •   dty    15 年前

    我觉得文件很清楚!从内存来看,它会一直等到线程完成,除非您用shutdownnow()方法告诉它。