2011-08-28 13 views
9

Attualmente sto pensando a come progettare un sistema di multithreading in Java che deve fare un po 'di pesante elaborazione di rete e archiviazione del database. Il programma lancerà inizialmente tre thread di base. Lungo questi thread di base, vorrei avviare altri thread non dal programma principale ma da due dei thread. E 'possibile per un filo di lanciare un altro filo conduttore a una sorta di una gerarchia simile:Thread all'interno delle discussioni in Java?

> Parent ->t0 thread1 -> t1 tread1.1 
>  ->t0 thread2 
>  ->t0 thread3 -> t2 thread3.1 

t0= inital time 
t1,t2 = time at a point in the running thread 
t1 != t2 

Altrimenti qualcuno potrebbe fornire una soluzione teorica con i riferimenti?

+1

Ehm, sì. Perché non potresti? Forse se l'hai provato ... –

+0

Non sono sicuro di cosa stai chiedendo. Puoi creare un nuovo thread da qualsiasi codice java, indipendentemente dal thread in cui è in esecuzione. I thread devono mantenere i riferimenti agli altri thread che generano? Qual è lo scopo della gerarchia che descrivi? – Russell

risposta

8

Sì, è possibile avviare tutti i thread che si desidera, ma probabilmente non è il modo migliore. È molto meglio utilizzare le API non bloccanti in modo da poter avviare l'esecuzione di alcune chiamate esterne e il thread chiamante può immediatamente iniziare a fare qualcos'altro senza attendere che la chiamata socket/database torni indietro. Quindi, quando ritorna la chiamata socket/database, viene attivata una richiamata per completare l'elaborazione.

L'I/O non bloccante può fornire un utilizzo della CPU di gran lunga superiore poiché si stanno attivando chiamate e si registrano i callback e non si deve cercare di bilanciare il numero "giusto" di thread simultanei che per lo più dormono comunque.

http://www.owlmountain.com/tutorials/NonBlockingIo.htm

http://www.tensegrity.hellblazer.com/2008/03/non-blocking-jdbc-non-blocking-servlet-apis-and-other-high-mysteries.html

+0

Ti capita di sapere come posso continuare a eseguire il thread indipendentemente dalle eccezioni. Le eccezioni sembrano interrompere i thread (che sto facendo). Ho provato a risolverlo creando un thread all'interno di un thread ma l'eccezione nel thread B (creato dal thread interno A) interrompe entrambi i thread. Le bandiere booleane per entrambi sono rimaste vere dopo che si sono fermate. – Lealo

2

Sì un thread può lanciare un altro thread, e quel filo può lanciare filo (s) e così via ...

Nel metodo di un filo run() - è possibile creare e avviare altri thread.

3

Per rispondere alla domanda, sì thread possono lanciare altri thread.

La gerarchia è importante?

Probabilmente stai meglio usando un ExecutorService con un pool di thread memorizzato nella cache. In questo modo è possibile raggruppare i thread anziché creare lotti (che è costoso). ExecutorServices fornisce anche altre cose interessanti, e l'utilizzo di Callables/Runnables con loro è probabilmente molto più facile da testare rispetto a fare i thread con i tuoi stessi thread.

0

E 'possibile per exemple è possibile creat filo e mettere id in ordine come questo

UnThread[] tab= new UnThread[10] ; 

for (int i=0;i<20;i++) 

tab[i] = new UnThread(); 

Dopo si può dare al subMainThread la scheda matrice

exemple

while(tab[1].isAlive()) { 
    //do somthing.. 
    System.out.println("Ligne affichée par le main"); 
    try { 
    // et faire une pause 
    tab[1].sleep(800); 
    } 
    catch (InterruptedException ex) {} 
} 

qui un semplice uso di thread: http://kamel.berrayah.com/wordpress/2013/07/java-threads/