2010-03-26 15 views
7

Esperti -Multi: Threading - È questo l'approccio giusto?

Ho bisogno di un consiglio nel seguente scenario.

Ho un file di configurazione con un elenco di attività. Ogni attività può avere zero, una o più dipendenze. Volevo eseguire queste attività in parallelo [in questo momento vengono eseguite in sequenza]

L'idea è di avere un programma principale per leggere il file di configurazione e caricare tutte le attività. Leggi le singole attività e assegnale a un esecutore [callable] che eseguirà l'attività e restituirà i risultati in un futuro. Quando l'attività viene inoltrata all'esecutore (thread), controllerà che le sue dipendenze finiscano prima ed esegua la propria attività.

È questo l'approccio giusto? Esistono altri approcci migliori che utilizzano le funzionalità di java 1.5?

+0

Stai reinventando l'utility 'ant' o' maven'? Perché non stai semplicemente definendo i compiti di 'Ant' per questo? –

+0

S.Lott ~ Questo è relativo allo script ant o maven e all'esecuzione dell'attività. Le attività che ho menzionato sopra sono relative all'attività del database, all'archiviazione, all'elaborazione delle regole, ecc. [Possono essere in qualsiasi combinazione!] – jagamot

+0

Questa è già una funzionalità di 1.5! –

risposta

5

Suoni bene, ma attenzione di Thread starvation deadlock. Fondamentalmente, non usare un pool di thread limitato.

Ecco un esempio che illustra questo problema.
http://www.javaconcurrencyinpractice.com/listings/ThreadDeadlock.java

Inoltre, se si dispone per es. una connessione DB in pool, potresti incontrare anche dei problemi. 10 thread possono bloccare, mantenendo tutta la connessione in pool, in attesa dell'11 ° thread che non può acquisire l'11a connessione in pool perché non è più disponibile ..

+0

+1. Questo tipo di domande è comune su SO e qualcuno suggerisce sempre la soluzione "invia tutte le attività contemporaneamente" senza menzionare questo rischio. – finnw

+0

Penso che l'altra sessione di ThreadDeadlock.java sia "fai attenzione con le attività che inviano più attività". In alcuni ambienti, si desidera impostare un limite massimo per il pool di thread. –

+0

Immagino, ho iniziato a correre nei problemi. Come posso risolverlo? – jagamot

3

Quello che hai descritto è l'approccio Java5/6.

Assicurati solo che le tue attività/Callables non siano condivise/non condividano lo stato.

1

Considerare l'utilizzo di ValueFuture (da guava) per comunicare tra le attività. Aggiungi un listener a ogni ValueFuture che invia una nuova attività a ExecutorService solo quando tutti i suoi input sono disponibili. In questo modo non avrai mai un blocco di thread in qualche modo attraverso un'attività in attesa che finisca un'altra attività.

+0

Heh, sembra un'ottima idea! +1 –

1

attività del database, l'archiviazione e la regola di elaborazione sono usi perfetti per Ant (o anche Maven)

Non reinventare questo. Basta usare Ant.

Scrivi attività ant per ogni attività. Definire le dipendenze in XML, usando le regole di dipendenza di Ant.

Trasforma formica libera per eseguire le attività in base alle dipendenze. È possibile iniziare con Ant Task "eseguibili" (http://ant.apache.org/manual/tasksoverview.html#exec) anziché definire la propria sottoclasse di Attività.

Ant comprende attività parallele. Non è necessario fare altro che dichiarare le attività come parallele. http://ant.apache.org/manual/Tasks/parallel.html

Non inventare alcun nuovo software per questo. Usa Ant.

+0

Puoi incorporare form in un'applicazione java? –

+0

Lo sapevo solo come uno strumento di costruzione .. Ho dato un'occhiata al manuale però. Quindi presumibilmente è possibile aggiungere ant.jar come dipendenza al progetto e chiamare a livello di programmazione gli script ant che descrivono le attività? –

+0

Questo è il punto di ant - risolvere le dipendenze eseguendo le attività. Questo è solo un punto. Compilare e creare un file JAR è l'applicazione più comune di questo tipo di elaborazione. Ma * qualsiasi cosa * che implichi elaborazione e dipendenze può essere gestita elegantemente da Ant. –

1

In realtà, si do si desidera il multi-threading quando il costo di avvio di più processi è costoso.

Che, francamente, è quasi tutto ciò che gira una copia della JVM.

Per rispondere all'OP, ANT è in grado di eseguire attività in parallelo ma NON in parallelo. Quindi, anche se si dispone di un file build.xml che si desidera modificare per l'esecuzione parallela, è necessario eseguire una riscrittura maggiore. (Penso che sia stata una decisione progettuale piuttosto strana presa dagli sviluppatori ANT dal momento che hai già il tuo grafico di dipendenza descritto dagli obiettivi stessi.)

Problemi correlati