Ho il sospetto che nulla fornito in java.util.concurrent
lo farà per voi, solo perché se avete bisogno di un servizio di esecuzione pianificata, spesso avete attività ricorrenti da eseguire. Se si dispone di un'attività ricorrente, il valore di solito ha più senso semplicemente mantenere lo stesso thread e utilizzarlo per la ricorrenza successiva dell'attività, piuttosto che abbattere il thread e dover crearne uno nuovo alla successiva ricorrenza .
Naturalmente, un esecutore pianificato può essere utilizzato per l'inserimento di ritardi tra attività non ricorrenti, oppure potrebbe essere utilizzato nei casi in cui le risorse sono così scarse e la ricorrenza è così rara che ha senso abbattere tutti i thread fino a nuovo lavoro arriva. Quindi, posso vedere casi in cui la tua proposta avrebbe sicuramente un senso.
Per implementare questo, vorrei prendere in considerazione il tentativo di racchiudere un pool di thread memorizzato nella cache da Executors.newCachedThreadPool
insieme a un servizio di esecuzione di un programma con un solo thread (ad esempio new ScheduledThreadPoolExecutor(1)
). Le attività possono essere pianificate tramite il servizio di esecuzione pianificata, ma le attività pianificate vengono archiviate in modo tale che anziché eseguirle con un programma di esecuzione pianificata a thread singolo, l'executor a thread singolo le passerà al pool di thread memorizzato nella cache per l'effettivo esecuzione.
Quel compromesso ti darebbe il massimo di un thread in esecuzione quando non c'è assolutamente lavoro da fare e ti darebbe tutti i thread necessari (nei limiti del tuo sistema, ovviamente) quando ci sono molti di lavoro da fare.
fonte
2010-02-25 19:19:08
Sembra che tu voglia qualcosa che crea e abbatte i thread come un 'ExecutorService' da' Executors.newCachedThreadPool() ', a parte il fatto che ti piacerebbe implementare l'interfaccia' ScheduledExecutorService' invece di solo 'ExecutorService' interfaccia. È un riassunto accurato? –
In realtà, si, è un riassunto abbastanza accurato. –