Newsgroup: it.comp.java
Titolo: Lanciare un thread all'interno di un altro thread

Salve a tutti
Ho un problema con la gestione (molto basilare a dire il vero) del 
multithreading in un programma che sto scrivendo.
Vi spiego prima di tutto qualìè il mio obbiettivo:
il programma si collega a Internet, scarica una pagina, la elabora e 
restituisce un risultato; queste operazioni possono rikiedere un certo 
tempo, quindi tutto il processo l'ho messo in un thread a parte 
(utilizzando SwingWorker).
Il problema è che, a volte, le operazioni sulla pagina dovrebbero 
iterarsi.....cioè, a partire da quella pagina, devo poi fare altre volte 
lo stesso processo.
Io avevo pensato, concettualmente, di avviare (nel caso sia necessario) 
un ulteriore thread dall'interno di quello che sta eseguendo...
Solo che non riesco a farlo....
Provo a inviarmi il codice, un poco spiegato:
 
         SwingWorker worker = new SwingWorker<String,Void>(){
         @Override
         protected String doInBackground() throws Exception {
             /* Codice vario per gestire una barra e simili....*/
             /* L'operazione principale, quella per cui di fatto sto 
usando il thread*/
	    String plot = getter.getPlotfromTitle();
             return plot==null? null : plot;
         }
         @Override
         protected void done(){
             try {
                 String result = get();
                 enableAll();
                 busyIconTimer.stop();
                 statusAnimationLabel.setIcon(idleIcon);
                 if(result==null){
                     // Altro codice di gestione....
		     ......
                     JOptionPane.showMessageDialog(null,"NON TROVATO!");
                     Vector<String> dym = getter.getDidYouMean();
                     if(!(dym.isEmpty())){
                         JFrame mainFrame = 
GetPlotsApp.getApplication().getMainFrame();
                         dymBox = new DidYouMeanDialog(mainFrame, dym);
                         dymBox.setLocationRelativeTo(mainFrame);
                         GetPlotsApp.getApplication().show(dymBox);
 
			/* E qui, nel caso una variabile che viene modificata da dymBox 
contenesse dei dati,
			   vorrei avviare un thread UGUALE a quello che è eseguito adesso, 
però con i nuovi dati
                            (in sostanza solo cambierebbero dei 
parametri dell'oggetto "getter" ).
			   Solo che non so come fare per richiamare il thread...ho provato a 
inserire qui
			   una chiamata a doInBackground(), ma dopo essere entrato, non 
usciva più....*/
                     }
                 }
                 else{
                     txtarea.setText(result);
                 }
             } catch (InterruptedException ex) {
 
Logger.getLogger(GetPlotsView.class.getName()).log(Level.SEVERE, null, ex);
             } catch (ExecutionException ex) {
 
Logger.getLogger(GetPlotsView.class.getName()).log(Level.SEVERE, null, ex);
             }
         }
     };
     //Qui avvio il thread.
     worker.execute();
Spero di essere stato chiaro....
E soprattutto spero che qualcuno sappia darmi una dritta.....anche se 
implica cambiare il programma!!
Grazie a tutti!
Ciaoo

 piů....*/


un ulteriore thread dall'interno di quello che sta eseguendo...
Rischi di far proliferare il numero di thread (e considera che piů il
numero di thread cresce, piů le performance generali calano). Potresti
usare un unico thread e una coda in cui inserisci, appunto, le
informazioni da elaborare. Il thread č producer e consumer allo stesso
tempo.

 tempo.
Mi sembra che cosi' perderebbe tempo inutilmente aspettando sulle
operazioni di IO. Mi sembra di capire che questo programma si comporta
come un crawler (magari ha scopi diversi pero') e deve seguire link
interni ad ogni pagina.
Usare un thread singolo non mi sembra buono in questo contesto.
E la proliferazione puo' essere evitata grazie al thread pooling.

 Usare un thread singolo non mi sembra buono in questo contesto.
Perché no? io ne ho scritto uno che lavora in maniera efficiente usando un
thread singolo. Bada che usare il multithread è RARAMENTE "buono".
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 c'è alcuna perdita inutile di tempo...
Mentre scarico una pagina da processare potrei approffitarne per
scaricare un'altra pagina.
A meno che non usi I/O asincrono con un crawler a singolo thread...in
questo caso alzo le mani...