Raccoglie ed elabora i dati da più thread in Java

2

Esiste un programma Java che legge un elenco di ordini e per ciascun ordine avvia un thread che riceve dati da SQL e stampa l'elenco di elementi in un determinato ordine in un nome_ordine.html. Voglio scrivere una classe che genererebbe all_orders.html che contiene un elenco di articoli e la quantità di ciascun articolo in tutti gli ordini.

Questo è piuttosto semplice in un singolo ambiente con thread. Scrivi i dati rilevanti su order_name.csv, una volta che tutti i thread si fermano - analizza questi file e se l'elemento esiste - incrementa contatore, altrimenti - aggiungilo all'elenco e imposta il contatore a 1. Una volta analizzati tutti i file - crea il rapporto.

Come posso farlo in un caso multithread? Innanzitutto, è sicuro creare un private static list<items(String name, int count)> e cercare / modificarlo da più thread? Come controllare che tutti i thread siano finiti, il list<items> è completo e posso iniziare a preparare all_items.html? C'è un metodo migliore di un elenco statico?

Modifica: il programma è multithreading per ragioni storiche e per accelerare l'elaborazione di più ordini. Il tutto_orders.html verrà preparato utilizzando un singolo thread. Qual è il modo corretto per passare informazioni a questo thread. Nello specifico l'ordine "a" ha 2 elementi "pippo" e 5 elementi "barra". E alla fine che questo ordine è completamente processato e non ha altri elementi.

    
posta sixtytrees 17.06.2016 - 19:56
fonte

1 risposta

3

First, is it safe to create a private static list and search/modify it from multiple threads?

No. Per lo meno ti consigliamo di utilizzare uno dei concurrent collezioni . Questo potrebbe non essere sufficiente. Ad esempio, se devi eseguire più operazioni sulla lista prima che qualsiasi altro thread lo tocchi, avrai bisogno di un altro tipo di blocco.

How to check that all threads finished, the list is complete and I can start preparing all_items.html? Is there a better method than a static list?

Ci sono molti modi per farlo. Se sai quanti thread di scrittura ci sono, un CountDownLatch potrebbe essere una buona soluzione per te. Quello che fai è che il thread di elaborazione aspetti il latch e che ogni writer aggiorni il latch quando è completo.

Una lista statica funzionerà, ma in genere è preferibile passare la lista alle cose che scriveranno nel costruttore.

Per i primi 2 commenti, ecco un design semplice che dovrebbe essere sicuro:

Nel thread principale, genera un array di liste dove la dimensione dell'array. Per ogni slot, inserisci un nuovo CopyOnWriteArrayList , crea un nuovo Runnable e passare la matrice ad esso (memorizzare il riferimento in un finale) e avviare la discussione. Una volta completati tutti i thread, è possibile eseguire il loop del contenuto degli elenchi dell'array. Questo potrebbe essere un po 'eccessivo, ma non si desidera eseguire il debug di problemi di threading pazzi e potrebbe funzionare su una macchina e fallire su un'altra se non è completamente solida.

    
risposta data 17.06.2016 - 20:26
fonte

Leggi altre domande sui tag