java - ExecutorService什么时候回收可运行对象垃圾?

标签 java multithreading executorservice

我有一个可运行对象 A,它在实例化时与服务器交换心跳信号。我将 n 个这样的对象提交给一个固定线程池大小为 n 的执行程序服务。当 run 方法遇到异常时它会返回。对于给定的情况,我的所有线程都遇到异常并返回,但创建的对象仍然存在并继续交换心跳信号。我如何将这些对象标记为垃圾收集,以便它们停止心跳信号交换?

class A implements Runnable {
    public void run(){
          try{
           \\throws error
          } catch(Exception e){
            \\returns
          }
       }

    public static void main(){
          ExecutorService executor = Executors.newFixedThreadPool(n)
          for(i = 1 to n){
               A a = new A()
               executor.submit(a)
          }
       }
}

我应该在 main 的末尾调用 awaitTermination 并返回吗?

编辑:
换句话说,在所有线程返回后终止 executorservice 的一种方法是在 for 循环之后调用 shutdown() 并使用 Integer.MAX 长秒调用 awaitTermination,大约 70 年(这是我的时间限制不愿强加)。还有其他选择吗?

最佳答案

one way to terminate the executorservice after all the threads return would be to call shutdown() after the for loop and call awaitTermination with Integer.MAX long seconds which is roughly 70 years

正如文档所说,awaitTermination 方法将阻止 util:

  1. 所有任务在关闭请求后已完成执行
  2. 或者发生超时,
  3. 或者当前线程被中断,以先发生者为准


因此一旦三个事件中的一个出现,游戏就会结束,而不是必须等待 70 年。

关于java - ExecutorService什么时候回收可运行对象垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41443974/

相关文章:

c++ - openCV,C++ 并发,windows

c++ - 多生产者/消费者绩效

java - 如何检查 ExecutorService 上运行的所有任务是否已完成

java - 为什么从 Futures 获取值时会出现 NullPointerException?

java - 使用 JPA 工具进行对象关系映射 : Generate Tables from Entities feature

java - 需要在 Java 中继承 API 的帮助

multithreading - 我的应用程序需要使用 TCL 中的线程吗?

java - 如何在java中设置Socket写入超时?

java - hibernate 将不在表单提交中的实体属性更新为 null

java - Hibernate session.contains(类 clazz,序列化 id)