7

He utilizado multiprocesamiento en muchas de las aplicaciones que escribí. Mientras leía más me encontré con ThreadPoolExecutors. No pude diferenciar entre los dos escenarios sabios.MultiThreading Vs ThreadPoolExecutor

Todavía lo que entiendo es que debería usar multihilo cuando tengo una tarea. Quiero dividir una tarea en múltiples tareas pequeñas para utilizar la CPU y hacer el trabajo más rápido. Y use ThreadPoolExecutor cuando tengo un conjunto de tareas y cada tarea se puede ejecutar de forma independiente.

Por favor, corríjanme si estoy equivocado. Gracias

+1

Ese es mi entendimiento también. Utilice ThreadPoolExecutor para hilos ** independientes ** y enfoque Multithread para ** divide/conquista ** – gtgaxiola

Respuesta

17

A ThreadPoolExecutor es solo una API de alto nivel que le permite ejecutar tareas en varios subprocesos sin tener que lidiar con la API de Thread de bajo nivel. Entonces realmente no tiene sentido diferenciar entre multihilo y ThreadPoolExecutor.

Hay muchos sabores de ThreadPoolExecutor s, pero la mayoría de ellos permite que se ejecute más de un hilo en paralelo. Normalmente, usaría un Executor Service y usaría la fábrica Executors.

Por ejemplo, un ExecutorService executor = Executors.newFixedThreadPool(10); se ejecutarán las tareas que usted presente en 10 hilos.

1

ThreadPoolExecutor es una forma de múltiples hilos, con un API simple de usar que utilizan directamente Hilos, donde usted presente de hecho tareas. Sin embargo, las tareas pueden enviar otras tareas, por lo que no necesitan ser independientes. En cuanto a la división de tareas en subtareas, puede que esté pensando en la nueva API fork/join en JDK7.

6

Los grupos de subprocesos (ejecutores) son una forma de subprocesamiento múltiple, específicamente una implementación del único productor: patrón de consumidor múltiple, en el que un subproceso coloca trabajo repetidamente en una cola para que se ejecute un equipo de subprocesos de trabajo. Se implementa utilizando subprocesos regulares y ofrece varias ventajas:

  • anonimato de subprocesos: no se controla explícitamente qué subproceso hace qué; acaba de disparar tareas y serán manejadas por el grupo.
  • que encapsula una cola de trabajo y el hilo de equipo - no hay necesidad de molestar implementar propia cola de flujos seguros y la colocación de hilos.
  • balanceo de carga - ya que los trabajadores toman nuevas tareas cuando terminan las anteriores, el trabajo se distribuye de manera uniforme, cumpliendo con un número suficientemente grande de tareas disponibles.
  • reciclaje de hilos: solo cree un solo grupo al principio y manténgalo alimentado. No es necesario seguir iniciando y eliminando los hilos cada vez que se necesita trabajar.

Dado lo anterior, es cierto que las piscinas son adecuados para las tareas que normalmente son independientes el uno del otro, y por lo general de corta duración (tiempo de E/S de operaciones limitaré a atar los hilos de la piscina que no lo hará ser capaz de hacer otras tareas).

9

ThreadPoolExecutor es una forma de hacer multihilo. Por lo general se utiliza cuando

  1. tienen operaciones independientes que no requieren la coordinación (aunque nada que impide la coordinación, pero hay que tener cuidado)
  2. desea limitar la capacidad de la cantidad de operaciones que se' se está ejecutando de inmediato, y (opcionalmente) desea poner en cola las operaciones cuando se ejecuta si el grupo está trabajando actualmente en todos los hilos.

Java 7 tiene otra clase incorporada llamada ForkJoinPool que se usa generalmente para las operaciones de tipo Map-Reduce. Por ejemplo, uno puede imaginar implementar un tipo de fusión utilizando ForkJoinPool dividiendo la matriz en 1/2 en cada punto de horquilla, esperando los resultados y fusionando los resultados.

1

De la documentación del código fuente de ThreadPoolExecutor

/* 
 
* <p>Thread pools address two different problems: they usually 
 
* provide improved performance when executing large numbers of 
 
* asynchronous tasks, due to reduced per-task invocation overhead, 
 
* and they provide a means of bounding and managing the resources, 
 
* including threads, consumed when executing a collection of tasks. 
 
* Each {@code ThreadPoolExecutor} also maintains some basic 
 
* statistics, such as the number of completed tasks. 
 
* 
 
* <p>To be useful across a wide range of contexts, this class 
 
* provides many adjustable parameters and extensibility 
 
* hooks. However, programmers are urged to use the more convenient 
 
* {@link Executors} factory methods {@link 
 
* Executors#newCachedThreadPool} (unbounded thread pool, with 
 
* automatic thread reclamation), {@link Executors#newFixedThreadPool} 
 
* (fixed size thread pool) and {@link 
 
* Executors#newSingleThreadExecutor} (single background thread), that 
 
* preconfigure settings for the most common usage 
 
* scenarios. 
 
*/

ThreadPoolExecutor es una manera de lograr la concurrencia. Hay muchas maneras de lograr concurrencia:

Executors marco proporciona diferentes API. Algunas de las API importantes se enumeran a continuación.

static ExecutorService newFixedThreadPool(int nThreads) 

Crea un grupo de subprocesos que se vuelve a utilizar un número fijo de hilos que operan frente a una cola sin límites compartido.

static ExecutorService newCachedThreadPool() 

Crea un grupo de subprocesos que crea nuevos temas, según sea necesario, pero volverá a utilizar hilos ya construidos cuando están disponibles.

static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 

Crea un grupo de subprocesos que se pueden programar los comandos a ejecutar después de un retraso dado, o para ejecutar periódicamente.

static ExecutorService newWorkStealingPool() 

Crea un grupo de subprocesos robar el trabajo a utilizar todos los procesadores disponibles como su nivel de paralelismo objetivo.

Tener un vistazo a continuación preguntas SE:

java Fork/Join pool, ExecutorService and CountDownLatch

How to properly use Java Executor?