Как сохранить ожидание потока в ScheduledExecutorService, который был отключен

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;
}

Когда я профилировал приложение, я заметил, что запланированные потоки, созданные этим методом, всегда находятся в состоянии «Выполняется», а не в состоянии «Ожидание». ", прежде чем они будут казнены. Если я удаляю executorService.shutdown(), он делает то, что я хочу (т.е. потоки остаются в состоянии ожидания, пока не наступит время их запуска). Однако без executorService.shutdown() потоки, отличные от Daemon, никогда не удаляются сборщиком мусора после выполнения. Есть ли способ убедиться, что потоки всегда находятся в состоянии ожидания перед выполнением? или какую другую замену я могу использовать для этого метода, чтобы гарантировать, что:

  • я могу прикрепить префикс к именам потоков, которые выполняются в службе-исполнителе (по сути, это то, что делает реализация DefaultThreadFactory)
  • потоки, не являющиеся демонами, получают GC после казни.
  • созданные потоки остаются в состоянии ожидания до тех пор, пока не наступит время их выполнения.
5
задан Kes115 24 May 2012 в 12:06
поделиться