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() を使用しないと、デーモン以外のスレッドが実行後にガベージ コレクションされることはありません。実行前にスレッドが常に待機状態であることを確認する方法はありますか? または、次のことを保証するために、このメソッドに使用できる他の代替品は何ですか?
- エグゼキューター サービスで実行されるスレッドの名前にプレフィックスを付けることができます (これは、実質的に DefaultThreadFactory 実装が行うことです)。
- 非デーモン スレッドは、実行後に GC を取得します。
- 作成されたスレッドは、実行する時間になるまで待機状態のままになります。