que newfixedthreadpool example awaittermination java multithreading executorservice

java - newfixedthreadpool - runnable executorservice example



¿Cómo decidir si usar newCachedThreadPool o newFixedThreadPool? (1)

Estoy trabajando en un proyecto en el que necesito asegurarme de que cada hilo esté trabajando en un rango particular. Por ejemplo:

NO_OF_THREADS: 2 NO_OF_TASKS: 10

Si el number of threads is 2 y el number of tasks is 10 , cada subproceso realizará 10 tasks . Entonces eso significa que 2 hilos estarán haciendo 20 tasks .

En el escenario real, estos números (número de tareas y número de subprocesos) serán muy altos ya que ambos pueden configurarse en mi código.

En el ejemplo anterior, el first thread debe usar id entre 1 and 10 y el second thread debe usar id entre 11 and 20 y así sucesivamente, si hay más subprocesos. Y después de eso, cada hilo realizará una conexión de base de datos y luego se insertará en la base de datos.

Así que tengo mi código de abajo que está funcionando bien.

public static void main(String[] args) { final int noOfThreads = 2; final int noOfTasks = 10; //create thread pool with given size ExecutorService service = Executors.newFixedThreadPool(noOfThreads); // queue some tasks for (int i = 0, int nextId = 1; i < noOfThreads; i++, nextId += noOfTasks) { service.submit(new ThreadTask(nextId, noOfTasks)); } } class ThreadTask implements Runnable { private final int id; private int noOfTasks; public ThreadTask(int nextId, int noOfTasks) { this.id = nextId; this.noOfTasks = noOfTasks; } public void run() { //make a database connection for (int i = id; i < id + noOfTasks; i++) { //insert into database } } }

Mi pregunta:-

Estaba revisando varios artículos en Internet y leí sobre newCachedThreadPool . Así que ahora me pregunto si debería usar newFixedThreadPool o newCachedThreadPool en mi código. Como actualmente estoy usando nexFixedThreadPool . No puedo decidir qué factores debo elegir newCachedThreadPool o newFixedThreadPool . Esa es la razón por la que publiqué mi escenario, lo que voy a hacer con mi código.

¿Alguien puede ayudarme? ¿Qué debería elegir aquí? Y, por favor, explíqueme en detalle por qué elegimos eso sobre qué factores para que pueda entender esto muy bien. Ya he revisado los documentos de Java, pero no puedo decidir qué debería elegir aquí.

Gracias por la ayuda.


Así que ahora me pregunto si debería usar newFixedThreadPool o newCachedThreadPool en mi código.

Para citar de los Javadocs, el newFixedThreadPool() :

Crea un grupo de subprocesos que reutiliza un número fijo de subprocesos ...

Esto significa que si pides 2 subprocesos, se iniciarán 2 subprocesos y nunca se iniciarán 3. Por otro lado, el newCachedThreadPool() :

Crea un grupo de subprocesos que crea nuevos subprocesos según sea necesario, pero reutilizará los subprocesos construidos previamente cuando estén disponibles.

En su caso, si solo tiene 2 hilos para ejecutar, cualquiera de los dos funcionará bien, ya que solo enviará 2 trabajos a su grupo. Sin embargo, si desea enviar los 20 trabajos a la vez pero solo tiene 2 trabajos ejecutándose a la vez, debe usar un newFixedThreadPool(2) . Si utilizó un grupo en caché, cada uno de los 20 trabajos iniciará un subproceso que se ejecutará al mismo tiempo, lo que puede no ser óptimo dependiendo de la cantidad de CPU que tenga.

Por lo general, uso newCachedThreadPool() cuando necesito que el subproceso se genere inmediatamente, incluso si todos los subprocesos que se están ejecutando actualmente están ocupados. Recientemente lo usé cuando estaba generando tareas de temporizador. El número de trabajos concurrentes es irrelevante porque nunca engendro muchos, pero quiero que se ejecuten cuando se solicitan y quiero que reutilicen los hilos inactivos.

Utilicé newFixedThreadPool() cuando deseo limitar la cantidad de tareas simultáneas que se ejecutan en cualquier punto para maximizar el rendimiento y no inundar mi servidor. Por ejemplo, si estoy procesando 100k líneas de un archivo, una línea a la vez, no quiero que cada línea comience un nuevo hilo, pero quiero un cierto nivel de concurrencia, así que asigno (por ejemplo) 10 hilos fijos para ejecutar el Tareas hasta agotar la piscina.