2010-03-22 21 views
5

Come uccidere il thread? ..... Come riavviarli di nuovo in multi-threading?Informazioni sulla multi threading

+0

C'è Thread.stop(): http://java.sun.com/javase/6/docs/api/java/lang/Thread. html # stop(), ma non è consigliabile farlo: http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html –

+1

La pagina effettiva che spiega i pericoli di thread primitives è http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html – Will

+0

@chetans, dovresti riscriverlo in modo che sia più specifico e più sensato. – avpx

risposta

2

avvolgo i thread del mio worker nella loro classe e utilizzo una proprietà terminata per terminare il loop proc proc.

dispiace io non sono una versione di Java a portata di mano in questo momento, ma si dovrebbe ottenere l'idea da questo http://pastie.org/880516

using System.Threading; 

namespace LoaderDemo 
{ 
    class ParserThread 
    { 
     private bool m_Terminated; 
     private AutoResetEvent m_Signal; 
     private string m_FilePath; 
     ... 

     public ParserThread(AutoResetEvent signal, string filePath) 
     { 
      m_Signal = signal; 
      m_FilePath = filePath; 

      Thread thrd = new Thread(this.ThreadProc); 
      thrd.Start(); 
     } 

     public bool Terminated { 
      set { m_Terminated = value; } 
     } 

     private Guid Parse(ref string s) 
     { 
      //parse the string s and return a populated Guid object 
      Guid g = new Guid(); 

      // do stuff... 

      return g; 
     } 

     private void ThreadProc() 
     { 
      TextReader tr = null; 
      string line = null; 
      int lines = 0; 

      try 
      { 
       tr = new StreamReader(m_FilePath); 
       while ((line = tr.ReadLine()) != null) 
       { 
        if (m_Terminated) break; 

        Guid g = Parse(ref line); 
        m_GuidList.Add(g); 
        lines++; 
       } 

       m_Signal.Set(); //signal done 

      } 
      finally 
      { 
       tr.Close(); 
      } 

     } 

    } 
} 
3

Thread.stop() uccide un thread, ma è sicuramente non fare desidera fare ciò (consultare la documentazione dell'API per una spiegazione). Thread.interrupt() invia una notifica asincrona a un thread, in modo che possa chiudersi automaticamente.

Per un testo completo sul multithreading Java, consiglio B. Goetz, Concorrenza Java in pratica, Addison-Wesley Professional.

+5

Thread.stop() è un po 'come mettere una macchina che viaggia a 60 miglia all'ora nel parco per fermarlo ... sicuramente lo ferma, ma stai per lasciare una triste, triste traccia di metallo attorcigliato lungo la strada e la tua auto non sarà mai più la stessa ;-) –

+0

Inoltre, Thread.interrupt non interrompe sempre un thread in attesa su IO. Se sei seriamente intenzionato a progettare per l'interruzione, hai bisogno di un modo per chiudere forzatamente qualsiasi flusso IO il tuo thread di destinazione potrebbe essere in attesa su – radai

1

Il modo migliore per uccidere un thread è impostare un flag per il thread da guardare. Programma il thread da uscire quando vede che il flag è impostato su true. Non c'è modo di riavviare un thread ucciso.

+0

.... ma potresti salvare il runnable stesso per un uso successivo – radai

+2

Il modo migliore per uccidere un thread è chiamare Thread.interrupt() e hanno il thread anche monitorare periodicamente il suo stato di interrupt. L'aggiunta di un altro booleano è completamente ridondante. – EJP

+0

Oltre a ciò che ha detto EJP, la bandiera arrotolata a mano non funziona bene con gli esecutori. –

4

Poiché il tuo post è taggato "Java", ho una buona idea di ciò che stai dicendo. Diciamo che si avvia un thread facendo:

Thread foo = new Thread(someRunnable); 
foo.start(); 

Ora che destroy e gli amici sono obsoleti, è necessario un modo per uccidere il thread. Fortunatamente per te, c'è sempre stato il concetto di "interruzioni". Basta cambiare la tua eseguibile in modo che, in caso di interruzione, esca. Quindi chiama il metodo interrupt del thread.

foo.interrupt(); 

Se hai scritto il tuo Runnable per gestirlo correttamente, interromperà qualsiasi cosa stia facendo e terminerà.

1

Se si desidera avviare, arrestare, riavviare le discussioni a volontà, magari usando il Java 5 il pacchetto di concorrenza sarebbe una buona idea. Puoi avere un Executor che farà un po 'di lavoro, e quando hai bisogno che quel po' di lavoro sia fatto di nuovo, puoi semplicemente riprogrammare l'operazione da eseguire nell'esecutore.

3

Il metodo preferito per un Thread morire è per l'esecuzione del metodo run sino a completamento:

Thread t = new Thread(new Runnable() { 
    public void run() { 
    // Do something... 

    // Thread will end gracefully here. 
    } 
} 

volta un thread muore grazia nell'esempio precedente, il Thread non può essere riavviato. (Cercando di chiamare Thread.start su un filo che è già stato avviato causerà un IllegalThreadStateException.)

In tal caso, si può fare un altro esempio del filo e chiamare start su questo.

Probabilmente un buon posto per ottenere ulteriori informazioni sulla filettatura sarebbe Lesson: Concurrency da The Java Tutorials.

0

quanto riguarda la tua prima query sul filetto di uccidere:

è possibile trovare ulteriori dettagli sul tema in seguito domande SE:

How to properly stop the Thread in Java?

How can I kill a thread? without using stop();

How to start/stop/restart a thread in Java?

Per quanto riguarda il tuo secondo query di riavvio del thread, non è possibile in java.

Potete trovare sotto i dettagli nella documentazione page

inizio public void()

causa questo thread per iniziare l'esecuzione; la Java Virtual Machine chiama il metodo run di questo thread.

Il risultato è che due thread vengono eseguiti contemporaneamente: il thread corrente (che ritorna dalla chiamata al metodo start) e l'altro thread (che esegue il suo metodo run).

Non è mai legale avviare una discussione più di una volta. In particolare, un thread non può essere riavviato una volta completata l'esecuzione.

Invece di thread normali, è possibile utilizzare l'API simultanea avanzata per la gestione del ciclo di vita dei thread. Date un'occhiata a questo post per i dettagli ExecutorService:

How to properly use Java Executor?