当前位置: 首页 > 知识库问答 >
问题:

在Java中关闭ExecutorService的最佳方法

姬飞飙
2023-03-14

我试图用Java编写异步编程,并使用ExecutorService创建一个由多个线程支持的池来提交多个可调用任务,但对于如何关闭ExecutorService我没有什么问题。

以下是我的原始代码:

ExecutorService executorService = Executors.newFixedThreadPool(10);

Future<String> f = executorService.submit(() -> {/*do something*/});

executorService.shutdown();

String result = f.get();
System.out.println(result);

这样做很好,执行器在线程完成后关闭。但我担心如果写错了什么,可调用任务f.get()中的代码将永远占用,程序将永远停止,永远不会退出。

ExecutorService executorService = Executors.newFixedThreadPool(10);

Future<String> f = executorService.submit(() -> {/*do something*/});

executorService.shutdown();

if(!executorService.awaitTermination(10, TimeUnit.SECONDS)){
    executorService.shutdownNow();
}

String result = f.get();
System.out.println(result);

我的问题是如何设置强制关闭池中线程的时间,这样我就不需要显式地使用awaitterminate来阻止程序。

共有1个答案

莫宁
2023-03-14

但我担心如果写错了什么,可调用任务f.get()中的代码将永远占用,程序将永远停止,永远不会退出。

那是个虫子。你得确保这不会发生。

使用上面的代码,我可以确保线程在10秒后关闭

    null
 类似资料:
  • 我对ExecutorService的javadoc#shutdown方法感到困惑。这些说法不矛盾吗? 启动有序关闭,其中执行以前提交的任务,但不接受新任务。此方法不会等待以前提交的任务完成执行。使用waitTersion执行此操作。 如果它能有序地关闭之前提交的任务,那么它怎么能等它们完成执行呢?

  • 问题内容: 在我的webapp中,我创建了一个使用固定大小的ThreadPool的服务。我在整个应用程序生命周期中都重复使用了相同的代码。 所有人都在Tomcat中运行,这在关闭时给我以下错误: 我确实意识到我需要在关闭tomcat之前先关闭ExecutorService。Soms SO线程已经在谈论这一点,但是我找不到一种干净的方法来解决这个问题。 是否应该在正常关闭线程和执行器的情况下使用建议

  • 由于我不关心响应,也不关心这些任务产生的任何异常,所以我选择使用ExecutorService而不是Callable或CompletableFuture。 然后,对于我在controller中接收到的传入请求,运行两个for循环,并将这些任务分配给ExecutorService: 我的问题是关于关闭ExecutorService。我知道优雅关机(shutdown)、混合关机(awaitTermin

  • 问题内容: 我的应用程序使用Spring 处理传入消息。该应用程序的主要方法已经注册了一个关闭钩子。 问题是:强制关闭应用程序上下文的最佳方法是什么? 如果我在消息侦听器中抛出,则它由容器处理,并且不会传递。可以调用System.exit吗?我是否将传递给需要关闭的每个类,以便进行调用? 问题答案: 您可以将应用程序上下文投射到并调用它。至少在servlet上下文被破坏的情况下,在Web应用程序环

  • 问题内容: 我在互联网上寻找将数据从Java桌面应用程序导出到Excel的答案,并且遇到了Apache POI API 。然后我发现JDBC可以工作,然后偶然发现了JExcel。它们都是一样好,还是我应该专注于其中最好的,这是什么? 干杯。 问题答案: 我可能来不及回答这个问题,但是我想您的正确选择是Jxls。我在模块中遇到了类似的情况,必须保留徽标,颜色,col- span,固定列等特定模板…因

  • 在我的webapp中,我创建了一个使用具有固定大小线程池的的服务。我在整个应用程序生命周期中重用相同的。 All在Tomcat中运行,在关闭时出现以下错误: 我确实意识到在关闭tomcat之前需要关闭ExecutorService。Soms所以线程已经谈到了这一点,但我找不到一个干净的方法来处理这一点。 我是否应该使用,就像@tim-bender建议的那样,在优雅地关闭线程和执行器?还是应该使用C