什么时候在ExecutorService中收集可运行的对象垃圾?

ank*_*hah 5 java multithreading executorservice

我有一个可运行的对象A,它在实例化时与服务器交换心跳信号.我将这样的对象提交给具有固定线程池大小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)
          }
       }
}
Run Code Online (Sandbox Code Playgroud)

我应该在主要结束时进行awaitTermination调用并返回吗?

编辑:
以其他方式提出问题,在所有线程返回后终止执行器服务的一种方法是在for循环之后调用shutdown()并使用Integer.MAX长秒调用awaitTermination,这大约是70年(这是时间约束)我不愿意强加).还有其他选择吗?

nai*_*fei 1

在所有线程返回后终止 executorservice 的一种方法是在 for 循环之后调用 shutdown() 并使用 Integer.MAX 长秒调用awaitTermination,大约为 70 年

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

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


因此,只要三个事件之一出现,游戏就会结束,而不是等待 70 年。