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;
}
Quando ho eseguito il profiling dell'applicazione, ho notato che i thread pianificati creati con questo metodo sono sempre in "In esecuzione" anziché in stato "In attesa" prima di essere eseguiti. Se rimuovo executorService.shutdown() fa ciò che voglio (cioè i thread rimangono in attesa fino a quando non è il momento di eseguirli). Tuttavia, senza executorService.shutdown(), i thread non Demone non vengono mai raccolti automaticamente dopo l'esecuzione. C'è un modo per garantire che i thread siano sempre in attesa prima dell'esecuzione? o quale altra sostituzione posso usare per questo metodo per garantire che:Come mantenere thread in attesa in ScheduledExecutorService che è stato arrestato
- posso collegare prefisso ai nomi di fili che corrono nel servizio esecutore (che è efficace quanto l'attuazione DefaultThreadFactory fa)
- non-daemon i thread ottengono GC dopo l'esecuzione.
- creato I thread rimangono nello stato di attesa finché non è il momento di eseguirli.
+1 Ben fatto. Stavo pensando di suggerire questa soluzione come soluzione, ma funzionerebbe solo se un'attività è stata sottoposta a pianificazione (senza altri tipi di controlli come il conteggio delle esecuzioni), quindi ho deciso di non farlo. –