Ce que je recherche, c'est un moyen compatible de configurer ou non l'utilisation d'un pool de threads. Idéalement, le reste du code ne devrait pas du tout être affecté. Je pourrais utiliser un pool de threads avec 1 thread mais ce n'est pas tout à fait ce que je veux. Des idées?
ExecutorService es = threads == 0 ? new CurrentThreadExecutor() : Executors.newThreadPoolExecutor(threads);
// es.execute / es.submit / new ExecutorCompletionService(es) etc
java
concurrency
Michael Rutherfurd
la source
la source
AbstractExecutorService
ressemble à la voie à suivre.Runnable::run
Vous pouvez utiliser Guava
MoreExecutors.newDirectExecutorService()
, ouMoreExecutors.directExecutor()
si vous n'avez pas besoin d'un fichierExecutorService
.Si l'inclusion de Guava est trop lourde, vous pouvez mettre en œuvre quelque chose de presque aussi bon:
la source
Style Java 8:
Executor e = Runnable::run;
la source
J'ai écrit un
ExecutorService
basé sur leAbstractExecutorService
.la source
terminated
champ @ DaneelS.Yaitskov ne bénéficiera pas d'un accès synchronisé basé sur le code qui se trouve réellement ici. Les opérations sur les champs 32 bits sont atomiques en Java.Vous pouvez utiliser RejectedExecutionHandler pour exécuter la tâche dans le thread actuel.
Vous n'en avez besoin que d'un seul.
la source
java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy
.J'ai dû utiliser le même "CurrentThreadExecutorService" à des fins de test et, bien que toutes les solutions suggérées soient intéressantes (en particulier celle mentionnant la méthode Guava ), j'ai trouvé quelque chose de similaire à ce que Peter Lawrey a suggéré ici .
Comme mentionné par Axelle Ziegler ici , malheureusement, la solution de Peter ne fonctionnera pas réellement à cause de la vérification introduite dans
ThreadPoolExecutor
lemaximumPoolSize
paramètre du constructeur (c'estmaximumPoolSize
-à- dire impossible<=0
).Afin de contourner cela, j'ai fait ce qui suit:
la source