2010-03-22 7 views
5

¿Cómo matar el hilo? ..... ¿Cómo reiniciarlos nuevamente en multi threading?Acerca de multi threading

+0

Hay Thread.stop(): http://java.sun.com/javase/6/docs/api/java/lang/Thread. html # stop(), pero no se recomienda que lo haga: http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html –

+1

La página real que explica los peligros de thread primitives es http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html – Will

+0

@chetans, debe volver a escribir esto para que sea más específico y tenga más sentido. – avpx

Respuesta

2

envuelvo mis subprocesos de trabajo en su propia clase y uso una propiedad terminada para matar el bucle de proceso de subproceso.

lo siento no tengo una versión de Java a mano en este momento, pero usted debe conseguir la idea de esta 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() mata un hilo, pero definitivamente no desea hacer esto (consulte la documentación de la API para obtener una explicación de por qué). Thread.interrupt() envía una notificación asincrónica a un hilo, para que pueda cerrarse correctamente.

Para obtener un texto completo sobre multiprocesamiento en Java, recomiendo B. Goetz, Java Concurrency in Practice, Addison-Wesley Professional.

+5

Thread.stop() es como poner un automóvil que viaja a 60 mph en el parque para detenerlo ... definitivamente lo detiene, pero va a dejar un camino triste y triste de metal retorcido en el camino y su coche nunca será el mismo ;-) –

+0

también, Thread.interrupt no siempre interrumpirá un hilo esperando en IO. Si se toma en serio el diseñar para la interrupción, necesita una forma de cerrar forzosamente las transmisiones IO que su subproceso objetivo podría estar esperando en – radai

1

La mejor manera de matar un hilo es configurar un indicador para el hilo a mirar. Programe el hilo para salir cuando vea que el indicador se establece en verdadero. No hay forma de reiniciar un hilo muerto.

+0

.... pero podría guardar el ejecutable para usarlo más adelante – radai

+2

La mejor manera de matar un hilo es llamar Thread.interrupt() y hacer que el hilo también controle su estado de interrupción periódicamente. Agregar otro booleano es completamente redundante. – EJP

+0

Además de lo que dijo EJP, la bandera enrollada a mano no funciona bien con los ejecutores. –

4

Dado que su publicación está etiquetada como "Java", tengo una buena idea de lo que está diciendo. Digamos que inicie un hilo haciendo:

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

Ahora que destroy y amigos están en desuso, se necesita una forma para matar al hilo. Afortunadamente para ti, siempre ha existido el concepto de "interrupciones". Simplemente cambie su ejecutable para que, en la interrupción, salga. Luego, llame al método interrupt del hilo.

foo.interrupt(); 

Si escribió su Runnable para manejar esto correctamente, detendrá lo que está haciendo y terminará.

1

Si desea iniciar, detener, reiniciar hilos a su antojo, tal vez utilizando el Java 5 paquete de concurrencia sería una buena idea. Puede tener un ejecutor que haga un poco de trabajo, y cuando necesite volver a hacer ese trabajo, puede reprogramarlo para que se realice en el ejecutor.

3

La forma preferida para un Thread morir es para la ejecución del método run para ir a la terminación:

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

    // Thread will end gracefully here. 
    } 
} 

Una vez que un hilo muere gracia en el ejemplo anterior, el Thread no se puede reiniciar. (Tratando de llamar Thread.start en un hilo que ya se ha iniciado, se producirá un IllegalThreadStateException.)

En ese caso, se puede hacer otra instancia de la rosca y llamar start en eso.

Probablemente un buen lugar para obtener más información sobre enhebrar sería Lesson: Concurrency de The Java Tutorials.

0

En cuanto a su primera consulta en hilo de matar:

Usted puede encontrar más detalles sobre el tema por debajo de las preguntas 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?

Con respecto tu segundo consulta de volver a iniciar el hilo, no es posible en java.

puede encontrar debajo de los detalles en la documentación page

inicio public void()

Causas este hilo para comenzar la ejecución; Java Virtual Machine llama al método de ejecución de este hilo.

El resultado es que dos subprocesos se ejecutan simultáneamente: el subproceso actual (que regresa de la llamada al método de inicio) y el otro subproceso (que ejecuta su método de ejecución).

Nunca es legal iniciar un hilo más de una vez. En particular, un hilo no puede reiniciarse una vez que se ha completado la ejecución.

En lugar de Threads simples, puede utilizar la API simultánea avanzada para la gestión del ciclo de vida de los hilos. Echar un vistazo a este post para más detalles ExecutorService:

How to properly use Java Executor?

Cuestiones relacionadas