19

che sto attraversando diverso modello di concorrenza in un ambiente multi-threading (http://tutorials.jenkov.com/java-concurrency/concurrency-models.html)supporto Java per tre diversi modelli di concorrenza

L'articolo mette in evidenza circa tre concorrenza modelli.

  1. lavoratori parallele

    Il primo modello di concorrenza è quello che io chiamo il lavoratore modello parallelo. I lavori in entrata vengono assegnati a diversi lavoratori .

  2. Line Assembly

    I lavoratori sono organizzati come lavoratori alla catena di montaggio in una fabbrica. Ogni lavoratore esegue solo una parte del lavoro completo. Quando quella parte è finita, il lavoratore inoltra il lavoro al lavoratore successivo.

    Ogni lavoratore è in esecuzione nella propria thread e non condivide nessuno stato con altri lavoratori. Questo è anche a volte indicato come un modello di concorrenza nulla condiviso.

  3. funzionale parallelismo

    L'idea di base del parallelismo funzionale è di implementare il programma utilizzando chiamate di funzione. Le funzioni possono essere viste come "agenti" o "attori" che inviano messaggi tra di loro, proprio come nel modello di concomitanza della linea di assemblaggio (sistemi reattivi o basati su eventi AKA). Quando una funzione chiama un'altra, è simile all'invio di un messaggio.

Ora voglio mappare supporto API Java per questi tre concetti

  1. Lavoratori parallele: E 'ExecutorService, ThreadPoolExecutor, CountDownLatch API?

  2. Line Assembly: L'invio di un evento al sistema di messaggistica come JMS & utilizzando concetti di messaggistica di code & Tematica.

  3. funzionale Parallelismo: ForkJoinPool in una certa misura & java 8 flussi. ForkJoin pool è facile da capire rispetto ai flussi.

Sono corretto nel mappare questi modelli di concorrenza? Se no, correggimi

risposta

12

Ciascuno di questi modelli indica come il lavoro è stato eseguito/diviso da un punto di vista generale, ma quando si tratta di implementazione, dipende in realtà dal tuo problema esatto. In generale la vedo in questo modo:

  1. lavoratori parallele: un produttore crea nuovi posti di lavoro da qualche parte (per esempio in un BlockingQueue) e tanti fili (tramite un ExecutorService) Processo di quei posti di lavoro in parallelo. Naturalmente, è possibile utilizzare anche un CountDownLatch, ma ciò significa che si desidera attivare un'azione dopo che sono stati elaborati esattamente i sottoproblemi N (ad esempio, si sa che il problema principale potrebbe essere suddiviso in problemi minori, controllare the second example here).
  2. Linea di assemblaggio: per ogni passaggio intermedio, è disponibile un BlockingQueue e uno Thread o uno ExecutorService. In ogni fase i lavori vengono presi da uno BlickingQueue e inseriti nel successivo, per essere ulteriormente elaborati. Alla tua idea con JMS: JMS è lì per connettere componenti distribuiti e fa parte di Java EE e non è stato pensato per essere utilizzato in un contesto concomitante elevato (i messaggi vengono solitamente conservati sul disco rigido, prima di essere elaborati).
  3. Parallelismo funzionale: ForkJoinPool è un buon esempio su come è possibile implementarlo.
+0

Grazie. Sarebbe fantastico se fornissi alcune informazioni sul parallelismo funzionale. –

+0

Per il parallelismo funzionale, si prega di controllare http://akka.io, il miglior framework basato su modello di attore creato per jvm. –

+0

Alla fine del suo tutorial, l'autore dice "Java EE non ha più il vantaggio, mi sento". È davvero il caso?Queste tecniche non sono ancora state incorporate in Java EE? o non hanno in programma di aggiungere in futuro? – JavaHopper

5

Una domanda eccellente a cui la risposta potrebbe non essere altrettanto soddisfacente. I modelli di concorrenza elencati mostrano alcuni dei modi in cui potresti voler implementare un sistema concorrente.L'API fornisce gli strumenti utilizzati per l'implementazione di uno di questi modelli.

Iniziamo con ExecutorService. Ti consente di inviare attività da eseguire in modo non bloccante. L'implementazione ThreadPoolExecutor limita quindi il numero massimo di thread disponibili. ExecutorService non richiede che l'attività esegua il processo completo come ci si potrebbe aspettare da un worker parallelo. L'attività può essere limitata a una parte specifica del processo e inviare un messaggio al completamento che avvia il passaggio successivo in una catena di montaggio.

Il CountDownLatch e l'ExecutorService forniscono un mezzo per bloccare fino a quando tutti i lavoratori non hanno completato ciò che può tornare utile se un determinato processo è stato diviso in diverse sotto-attività concorrenti.

Il punto di JMS è quello di fornire un mezzo per la messaggistica tra i componenti. Non applica un modello specifico per la concorrenza. Code e argomenti indicano come un messaggio viene inviato da un editore a un sottoscrittore. Quando si utilizzano le code, il messaggio viene inviato esattamente a un sottoscrittore. Gli argomenti, d'altro canto, trasmettono il messaggio a tutti gli utenti dell'argomento.

È possibile ottenere un comportamento simile all'interno di un singolo componente, ad esempio utilizzando il modello di osservatore.

ForkJoinPool è in realtà un'implementazione di ExecutorService (che potrebbe evidenziare la difficoltà di associare un modello e un dettaglio di implementazione). Semplicemente è ottimizzato per lavorare con grandi quantità di piccoli compiti.

Riepilogo: Esistono diversi modi per implementare un determinato modello di concorrenza nell'ambiente Java. Le interfacce, le classi e i framework utilizzati nell'implementazione di un programma possono variare a prescindere dal modello di concorrenza scelto.

+0

fantastico! Solo una nota, ognuno di questi modelli si adatta a diversi casi d'uso che possono essere realizzati usando le classi di utilitj Java evidenziate in modo giudizioso. – yadab

Problemi correlati