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;
}
Kiedy profilowane aplikację, zauważyłem, że zaplanowane wątki tworzone tą metodą są zawsze w „Running” zamiast „Oczekiwanie” stanu, zanim zostaną one wykonane. Jeśli usuniemy executorService.shutdown(), zrobi to, co chcę (tzn. Wątki pozostają w stanie oczekiwania, dopóki nie nadejdzie czas, aby je uruchomić). Jednak bez executorService.shutdown() wątki nonDaemon nigdy nie zostaną zebrane podczas wykonywania. Czy istnieje sposób, w jaki mogę zagwarantować, że wątki są zawsze w stanie oczekiwania przed wykonaniem? lub co drugi wymiana mogę użyć tej metody, aby upewnić się, że:Jak utrzymać wątek czeka w ScheduledExecutorService który został zamknięty
- mogę dołączyć prefiks do nazw wątków, które działają w służbie executora (to skutecznie, co robi realizacja DefaultThreadFactory)
- Non-demon wątki pobierają GC po wykonaniu.
- utworzone Wątki pozostają w stanie oczekiwania, dopóki nie nadejdzie czas ich uruchomienia.
+1 Dobra robota. Zastanawiałem się nad zaproponowaniem tego rozwiązania jako rozwiązania, ale działałoby ono tylko wtedy, gdyby jedno zadanie zostało zgłoszone zgodnie z harmonogramem (bez innych rodzajów kontroli, takich jak liczba wykonywanych zadań), więc zrezygnowałem. –