如何关闭 ExecutorService?

新手上路,请多包涵

每当我调用 shutdownNow()shutdown() 它都不会关闭。我读到一些线程,其中说不能保证关闭 - 有人可以为我提供一个好的方法吗?

原文由 rosesr 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 457
1 个回答

典型的模式是:

 executorService.shutdownNow();
executorService.awaitTermination();

调用 shutdownNow 时,执行程序将(通常)尝试中断它管理的线程。为了优雅的关闭,你需要在线程中捕获中断的异常或者检查中断的状态。如果你不这样做,你的线程将永远运行,你的执行者将永远无法关闭。这是因为 Java 中线程的中断是一个协作过程(即被 中断 的代码必须在被要求停止时做某事,而不是 中断 代码)。

例如,以下代码打印 Exiting normally... 。但是,如果您注释掉 if (Thread.currentThread().isInterrupted()) break; 行,它将打印 Still waiting... 因为执行程序中的线程仍在运行。

 public static void main(String args[]) throws InterruptedException {
    ExecutorService executor = Executors.newFixedThreadPool(1);
    executor.submit(new Runnable() {

        @Override
        public void run() {
            while (true) {
                if (Thread.currentThread().isInterrupted()) break;
            }
        }
    });

    executor.shutdownNow();
    if (!executor.awaitTermination(100, TimeUnit.MICROSECONDS)) {
        System.out.println("Still waiting...");
        System.exit(0);
    }
    System.out.println("Exiting normally...");
}

或者,它可以用 InterruptedException 编写,如下所示:

 public static void main(String args[]) throws InterruptedException {
    ExecutorService executor = Executors.newFixedThreadPool(1);
    executor.submit(new Runnable() {

        @Override
        public void run() {
            try {
                while (true) {Thread.sleep(10);}
            } catch (InterruptedException e) {
                //ok let's get out of here
            }
        }
    });

    executor.shutdownNow();
    if (!executor.awaitTermination(100, TimeUnit.MICROSECONDS)) {
        System.out.println("Still waiting...");
        System.exit(0);
    }
    System.out.println("Exiting normally...");
}

原文由 assylias 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题