Lo que busco es una forma compatible de configurar el uso de un grupo de subprocesos o no. Idealmente, el resto del código no debería verse afectado en absoluto. Podría usar un grupo de subprocesos con 1 subproceso, pero eso no es exactamente lo que quiero. ¿Algunas ideas?
ExecutorService es = threads == 0 ? new CurrentThreadExecutor() : Executors.newThreadPoolExecutor(threads);
// es.execute / es.submit / new ExecutorCompletionService(es) etc
java
concurrency
Michael Rutherfurd
fuente
fuente
AbstractExecutorService
parece el camino a seguir.Runnable::run
Puede usar Guava's
MoreExecutors.newDirectExecutorService()
, oMoreExecutors.directExecutor()
si no necesita unExecutorService
.Si incluir guayaba es demasiado pesado, puede implementar algo casi tan bueno:
fuente
Estilo Java 8:
Executor e = Runnable::run;
fuente
Escribí un
ExecutorService
basado enAbstractExecutorService
.fuente
terminated
campo @ DaneelS.Yaitskov no se beneficiará del acceso sincronizado basado en el código que está realmente aquí. Las operaciones en campos de 32 bits son atómicas en Java.Puede utilizar RejectedExecutionHandler para ejecutar la tarea en el hilo actual.
Solo necesitas uno de estos.
fuente
java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy
.Tuve que usar el mismo "CurrentThreadExecutorService" para propósitos de prueba y, aunque todas las soluciones sugeridas fueron agradables (particularmente la que menciona el método Guava ), se me ocurrió algo similar a lo que Peter Lawrey sugirió aquí .
Como mencionó Axelle Ziegler aquí , desafortunadamente, la solución de Peter no funcionará debido a la verificación introducida en
ThreadPoolExecutor
elmaximumPoolSize
parámetro del constructor (es decirmaximumPoolSize
, no puede ser<=0
).Para eludir eso, hice lo siguiente:
fuente