definicion - Soporte de Java para tres modelos diferentes de concurrencia
graphics java example (2)
Cada uno de esos modelos dice cómo se realiza / divide el trabajo desde un punto de vista general, pero cuando se trata de la implementación, realmente depende de su problema exacto. Generalmente lo veo así:
- Trabajadores paralelos : un productor crea nuevos trabajos en algún lugar (por ejemplo, en un
BlockingQueue
) y muchos subprocesos (a través de unExecutorService
) procesan esos trabajos en paralelo. Por supuesto, también puede usarCountDownLatch
, pero eso significa que desea desencadenar una acción después de que se hayan procesado exactamenteN
subproblemas (por ejemplo, sabe que su gran problema puede dividirse enN
problemas más pequeños, consulte el segundo ejemplo aquí ). - Línea de ensamblaje : para cada paso intermedio, tiene un
BlockingQueue
y unThread
o unExecutorService
. En cada paso, los trabajos se toman de unBlickingQueue
y se colocan en el siguiente para ser procesados. Según su idea con JMS: JMS está ahí para conectar componentes distribuidos y es parte de Java EE y no se pensó que se usara en un contexto concurrente alto (los mensajes se guardan generalmente en el disco duro, antes de ser procesados). - Paralelismo funcional :
ForkJoinPool
es un buen ejemplo de cómo podría implementar esto.
Estoy pasando por diferentes modelos de concurrencia en un entorno de subprocesos múltiples ( http://tutorials.jenkov.com/java-concurrency/concurrency-models.html )
El artículo destaca sobre tres modelos de concurrencia .
Trabajadores paralelos
El primer modelo de concurrencia es lo que llamo el modelo de trabajador paralelo. Los puestos de trabajo entrantes se asignan a diferentes trabajadores .
Linea de ensamblaje
Los trabajadores se organizan como trabajadores en una línea de montaje en una fábrica. Cada trabajador solo realiza una parte del trabajo completo. Cuando se termina esa parte, el trabajador reenvía el trabajo al siguiente trabajador.
Cada trabajador se ejecuta en su propio subproceso y no comparte ningún estado con otros trabajadores. Esto también se denomina a veces un modelo de concurrencia de nada compartido.
Paralelismo funcional
La idea básica del paralelismo funcional es que implemente su programa usando llamadas de función. Las funciones pueden verse como " agentes " o " actores " que se envían mensajes entre sí, al igual que en el modelo de concurrencia de la línea de ensamblaje (sistemas reactivos AKA o controlados por eventos). Cuando una función llama a otra, es similar a enviar un mensaje.
Ahora quiero mapear el soporte de la API de Java para estos tres conceptos
Trabajadores paralelos : ¿Es ExecutorService , ThreadPoolExecutor , CountDownLatch API?
Línea de ensamblaje : enviar un evento a un sistema de mensajería como JMS y usar conceptos de mensajería de colas y temas .
Paralelismo funcional : ForkJoinPool hasta cierto punto y java 8 streams. La piscina de ForkJoin es fácil de entender en comparación con las corrientes.
¿Estoy correcto en el mapeo de estos modelos de concurrencia? Si no es así, por favor, corríjanme.
Una excelente pregunta para la cual la respuesta podría no ser tan satisfactoria. Los modelos de concurrencia enumerados muestran algunas de las formas en que podría querer implementar un sistema concurrente. La API proporciona herramientas utilizadas para implementar cualquiera de estos modelos.
Vamos a empezar con ExecutorService. Te permite enviar tareas para que se ejecuten de forma no bloqueante. La implementación de ThreadPoolExecutor limita el número máximo de subprocesos disponibles. El ExecutorService no requiere que la tarea realice el proceso completo como se podría esperar de un trabajador paralelo. La tarea puede estar limitada a una parte específica del proceso y enviar un mensaje al finalizar que comienza el siguiente paso en una línea de ensamblaje.
CountDownLatch y ExecutorService proporcionan un medio para bloquear hasta que todos los trabajadores hayan completado, lo que puede ser útil si un proceso determinado se ha dividido en diferentes tareas secundarias concurrentes.
El punto de JMS es proporcionar un medio para la mensajería entre componentes. No impone un modelo específico para la concurrencia. Las colas y los temas indican cómo se envía un mensaje de un editor a un suscriptor. Cuando utiliza colas, el mensaje se envía a exactamente un suscriptor. Por otro lado, los temas transmiten el mensaje a todos los suscriptores del tema.
Se podría lograr un comportamiento similar dentro de un solo componente utilizando, por ejemplo, el patrón observador.
ForkJoinPool es en realidad una implementación de ExecutorService (lo que podría resaltar la dificultad de hacer coincidir un modelo y un detalle de implementación). Simplemente resulta que está optimizado para trabajar con una gran cantidad de tareas pequeñas.
Resumen: Hay varias formas de implementar un determinado modelo de concurrencia en el entorno Java. Las interfaces, clases y marcos utilizados en la implementación de un programa pueden variar independientemente del modelo de concurrencia elegido.