java - 维护单个执行程序服务并适当关闭它

标签 java multithreading scheduledexecutorservice

我的应用程序要求异步完成某项工作,因此我求助于执行器框架。如果某个外部接口(interface)关闭(供应商可以备份一段时间,例如 30 分钟),则预计会运行此作业(Runnable)。

考虑到这个问题,我相信我应该维护一个具有固定编号的预定执行器服务。当我上面所说的接口(interface)短暂关闭时执行这些作业的核心线程数(作为我需要线程池的类中的静态变量)。我也不认为我应该为处理此类作业的每个需要创建一个执行器(单个调度线程池执行器),并在作业运行后关闭,因为这会违背我的目的,不是吗?因为这可能意味着在备份时间内为每项作业保留一个线程,这对我来说听起来很可怕。

但是,如果我要维护这样一个执行程序服务,我什么时候要关闭执行程序?我知道执行程序一旦关闭就无法重复使用,而不关闭执行程序并保持线程 Activity 可以防止 JVM 关闭。我该怎么办?

我的最后一个声明是基于 Effective Java 第二版:

And here is how to tell the executor to terminate gracefully (if you fail to do this, it is likely that your VM will not exit):

executor.shutdown();

最佳答案

This job (a Runnable) is expected to be run should a certain external interface be down (the vendor could be backed up for a while, say, 30 mins).

以上是您的要求。现在解决方案完全取决于如何处理上述情况。

  • 触发器或事件监听器:如果你有一些触发器或事件监听器,当发现某个外部接口(interface)关闭时可以调用它,然后在触发的代码或事件中监听器,您可以创建一个 ExecutorService,执行所有任务(您可以选择固定或池化线程池),然后在完成所有任务后,您可以关闭 ExecutorService >
    在这种情况下,最好创建一个 ExecutorService,执行任务并关闭它。不需要长时间运行ExecutorService

  • 跟踪或定期检查:如果您必须定期跟踪或检查某些外部接口(interface)是否已关闭,那么我认为您可以拥有一个 ScheduledThreadPoolExecutor实现在固定时间间隔后检查某个外部接口(interface)是否已关闭,如果已关闭则执行所有任务。在这种情况下,您不会关闭 ExecutorService 并且它将始终运行。

P.S.:“触发”和“跟踪”是我自己的惯例,我将切线作为一个词使用,因此请用技术术语来推断它。

I understand that an executor once shut down can't be reused, while not shutting down the executor and keeping threads active could prevent the JVM from shutting down.

是的,执行器一旦关闭就无法重复使用。
不,正在运行的 ExecutorService 不会阻止 JVM 关闭,但是一旦 JVM 关闭,ExecutorService 实例及其线程池将被停止并销毁。

关于java - 维护单个执行程序服务并适当关闭它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31430002/

相关文章:

java - 如何通过提供值从 HashMap 获取键?

java - Apache Kafka 0.9 Java API 使用主题开头的所有消息

c# - VS2010性能分析: How can I identify Worker Threads?(CurrentThread.Name产生异常)

Java:计时器或 ScheduleExecutorService 用于在繁忙的窗口中计算点击次数?

java - 从正在运行的线程调用方法

java - 如何引用 GridPane 中的特定节点

java - 删除多行Edittext android中的下一行可见性

java - 如何使用 ScheduledExecutorService 通过多个服务定期运行作业

java - 停止并从 ScheduledExecutorService 中删除任务

java - 从 future 抛出 InterruptedException