Cuando se crea un servicio de ejecutor (usando Executors.newFixedThreadPool (maxThreadNum) en java.util.concurrent) mis objeto inicia la aplicación. Cuando llegan solicitudes, el servicio ejecutor crea hebras para gestionar ellos.
Debido a que toma tiempo para crear hilos en tiempo de ejecución, quiero hacer subprocesos disponibles en el lanzamiento de la aplicación, de modo que cuando llegan solicitudes, se necesitaría menos tiempo para el proceso.
Lo que hice es lo siguiente:
executorService = Executors.newFixedThreadPool(200);
for (int i=0; i<200; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("Start thread in pool " );
}
});
}
Se crea 200 hilos en la piscina ExecutorService cuando se inicia la aplicación.
maravilla simplemente se trata de una forma correcta de crear hilos al iniciar la aplicación? ¿O hay una mejor manera de hacerlo?
Si usted puede utilizar un ThreadPoolExecutor
directamente en lugar de una ExecutorService
de Executors
1 , entonces no hay tal vez una forma más estándar / compatible para iniciar todos los hilos de núcleo inmediatamente.
int nThreads = 200;
ThreadPoolExecutor executor = new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
executor.prestartAllCoreThreads();
Los usos anteriores prestartAllCoreThreads()
.
Tenga en cuenta que, actualmente, la aplicación del Executors.newFixedThreadPool(int)
crea una ThreadPoolExecutor
en exactamente la misma manera que antes. Esto significa que podría emitidos, técnicamente, el ExecutorService
devueltos por el método de fábrica a una ThreadPoolExecutor
. No hay nada en la documentación que garantiza que será una ThreadPoolExecutor
, sin embargo.
1. ThreadPoolExecutor
implementos ExecutorService
, pero proporciona una mayor funcionalidad. Además, muchos de los métodos de fábrica en Executors
o bien vuelve una ThreadPoolExecutor
forma directa o un envoltorio que los delegados a uno. Algunos, como newWorkStealingPool
, utilice el ForkJoinPool
. Una vez más, los tipos de retorno de estos métodos de fábrica son detalles de implementación por lo que no confían demasiado en él.