O que estou procurando é uma forma compatível de configurar o uso de um pool de threads ou não. Idealmente, o resto do código não deve ser afetado. Eu poderia usar um pool de threads com 1 thread, mas não é bem isso que eu quero. Alguma ideia?
ExecutorService es = threads == 0 ? new CurrentThreadExecutor() : Executors.newThreadPoolExecutor(threads);
// es.execute / es.submit / new ExecutorCompletionService(es) etc
java
concurrency
Michael Rutherfurd
fonte
fonte
AbstractExecutorService
parece o caminho a seguir.Runnable::run
Você pode usar Goiaba
MoreExecutors.newDirectExecutorService()
, ouMoreExecutors.directExecutor()
se você não precisa de umExecutorService
.Se incluir Goiaba for muito pesado, você pode implementar algo quase tão bom:
fonte
Estilo Java 8:
Executor e = Runnable::run;
fonte
Escrevi um
ExecutorService
baseado noAbstractExecutorService
.fonte
terminated
campo @ DaneelS.Yaitskov não se beneficiará do acesso sincronizado com base no código que está realmente aqui. As operações em campos de 32 bits são atômicas em Java.Você pode usar o RejectedExecutionHandler para executar a tarefa no segmento atual.
Você só precisa de um desses.
fonte
java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy
.Tive que usar o mesmo "CurrentThreadExecutorService" para fins de teste e, embora todas as soluções sugeridas fossem boas (principalmente aquela que mencionava o método Guava ), descobri algo semelhante ao que Peter Lawrey sugeriu aqui .
Conforme mencionado por Axelle Ziegler aqui , infelizmente a solução de Peter não funcionará de fato por causa da verificação introduzida no parâmetro
ThreadPoolExecutor
domaximumPoolSize
construtor (ou seja,maximumPoolSize
não pode ser<=0
).Para contornar isso, fiz o seguinte:
fonte