Je suppose que rien de ce qui est prévu dans java.util.concurrent
ne le fera pour vous, simplement parce que si vous avez besoin d'un service d'exécution planifié, vous avez souvent des tâches récurrentes à effectuer. Si vous avez une tâche récurrente, alors il habituellement a plus de sens de garder le même fil autour et l'utiliser pour la prochaine récurrence de la tâche, plutôt que de démolir votre fil et d'en avoir un nouveau à la prochaine récurrence . Bien sûr, un exécuteur programmé pourrait être utilisé pour insérer des retards entre des tâches non récurrentes, ou il pourrait être utilisé dans les cas où les ressources sont si rares et la récurrence est si rare qu'il est logique de détruire tous vos threads jusqu'à le nouveau travail arrive. Donc, je peux voir des cas où votre proposition aurait certainement du sens.
Pour mettre en œuvre cela, je envisagerais d'essayer d'encapsuler un pool de threads mis en cache de Executors.newCachedThreadPool
avec un service d'exécution planifiée à un seul thread (par exemple, new ScheduledThreadPoolExecutor(1)
). Les tâches peuvent être planifiées via le service de l'exécuteur planifié, mais les tâches planifiées seront encapsulées de telle sorte que, plutôt que de les exécuter par l'exécuteur programmé monothread, l'exécuteur single-thread les remettra au pool de threads mis en cache exécution. Ce compromis vous donnerait un maximum de threads quand il n'y a absolument aucun travail à faire, et il vous donnerait autant de threads que nécessaire (dans les limites de votre système, bien sûr) quand il y a beaucoup de choses à faire du travail à faire.
Il semble que vous vouliez quelque chose qui créerait et détruirait des threads comme un 'ExecutorService' de' Executors.newCachedThreadPool() ', sauf que vous voudriez qu'il implémente l'interface' ScheduledExecutorService' au lieu de seulement 'ExecutorService' interface. Est-ce un résumé précis? –
En fait, oui, il est un résumé tout à fait exact. –