如何在已关闭的ScheduledExecutorService中保持线程等待

Kes*_*115 5 java multithreading executorservice

public ScheduledFuture<?> executeTaskWithDelay(String name, 
      final Runnable runnable, Period delay, boolean isDaemon) {
  ScheduledExecutorService executorService = 
        Executors.newSingleThreadScheduledExecutor(new DefaultThreadFactory(
          name, isDaemon));
  ScheduledFuture<?> future =  executorService.schedule(runnable, 
        delay.toStandardDuration().getMillis(), TimeUnit.MILLISECONDS);
  executorService.shutdown(); 
  return future;
}
Run Code Online (Sandbox Code Playgroud)

当我分析应用程序时,我注意到这个方法创建的调度线程在执行之前总是处于"正在运行"而不是"等待"状态.如果我删除executorService.shutdown()它会做我想要的(即线程保持等待状态,直到它们运行的​​时间).但是,如果没有executorService.shutdown(),nonDaemon线程在执行后永远不会被垃圾收集.有没有办法可以确保线程在执行前始终处于等待状态?或者我可以使用其他替代方法来确保:

  • 我可以在执行程序服务中运行的线程的名称附加前缀(这实际上是DefaultThreadFactory实现的功能)
  • 非守护程序线程在执行后获取GC.
  • 创建的线程保持等待状态,直到它们运行为止.

Kes*_*115 2

找到了一个解决方案: shutdown() 将所有待处理任务线程的状态从“等待”更改为“运行”。我现在使用 executorService 来安排对其自己的 shutdown() 的调用,而不是立即调用 shutdown()。这可确保挂起的任务尽可能长时间地保持等待状态,从而节省 CPU 资源。

public ScheduledFuture<?> executeTaskWithDelay(String name, 
      final Runnable runnable, Period delay, boolean isDaemon) {
  final ScheduledExecutorService executorService =  
        Executors.newSingleThreadScheduledExecutor(new DefaultThreadFactory(
      name, isDaemon));
  ScheduledFuture<?> future =  executorService.schedule(runnable, 
        delay.toStandardDuration().getMillis(), TimeUnit.MILLISECONDS);

  executorService.schedule(new Runnable() {
      @Override
      public void run() {
        executorService.shutdown();
      }}, delay.toStandardDuration().getMillis(), TimeUnit.MILLISECONDS);

  return future;
}
Run Code Online (Sandbox Code Playgroud)