Cuando yo uso 4 hilos para mi programa, normalmente, no hay problemas, pero hoy he aumentado a 8 y me di cuenta de 1-3 hilos de dejar de trabajar sin lanzar ninguna excepción. Es de todos modos hay que averiguar por qué se detiene? existe de todos modos para hacer el hilo reiniciar?

Esta es la forma en que la estructura de mi hilo es

public void run()
{
  Main.logger.info(threadName + ": New Thread started (inside run)");
  while (true)
  {
    try
    {
      //all my code
      //all my code
      //all my code
    }
    catch(Exception e)
    {
      Main.logger.error("Exception: " + e);
      try
      {
        Thread.sleep(10000);
      }
      catch (InterruptedException e1)
      {
        e1.printStackTrace();
      }
    }
    finally
    {               
      try
      {
        webClient.closeAllWindows();
        Thread.sleep(3000); 
        Main.logger.info(threadName + ": Closed browser!");
      }
      catch (Exception e)
      {
        Main.logger.error("Exception: " + e);
      }
    }  
  }//end while
}

Saludos!

  • Qué ves en el depurador?
  • Cuando usted dice «dejar de trabajar», se refiere a que los hilos de terminar, o que se consiga «atascado» y sentarse allí para siempre?
  • es difícil de decir, pero cuando voy a revisar los registros de el último mensaje es en el bloque finally, no sucede nada más con que el hilo después de que el bloque finally se ejecuta
  • poner un mensaje de consola en el extremo del hilo de ejecución de la aplicación que dice «la Paz que me voy de aquí» o algo así. Luego romper en esa línea o simplemente ver la consola
  • Tengo muchos mensajes de registro en mi hilo y cuando lo hacen fin, que de repente se va al bloque finally y grabados threadName: cerrado el navegador!
InformationsquelleAutor Arya | 2012-08-13

4 Comentarios

  1. 22

    Tenga en cuenta que un Error es no un ; es un Arrojadiza.

    Por lo tanto, si usted catch Exception, Errors obtendrá a través de:

    private void m() {    
        try {
            m(); //recursively calling m() will throw a StackOverflowError
        } catch (Exception e) {
            //this block won't get executed, 
            //because StackOverflowError is not an Exception!
        }
    }

    para la captura de «todo», cambie el código para esto:

    try {
        ...
    } catch (Throwable e) {
       //this block will execute when anything "bad" happens
    }


    Tenga en cuenta que puede ser poco se puede hacer si se produce un Error. Extracto de javadoc de Error:

    Un Error es una subclase de Arrojadiza que indica los problemas más serios que una aplicación razonable no debe tratar de atrapar. La mayoría de estos errores son condiciones anormales. El ThreadDeath error, a pesar de que un «normal» de la condición, también es una subclase de Error debido a que la mayoría de las aplicaciones no deben tratar de atraparlo.

    • ¿sabes cómo puedo tomar para que yo pueda encontrar la razón detrás de ella?
    • Coger Throwable en lugar de Exception. Nota a pesar de que la recuperación es más probable que no sea posible, ni siquiera un simple registro podría no funcionar.
    • He añadido un Arrojadiza bloque y me enteré de que el problema es de la JVM ejecuta fuera del espacio de montón. Después de aumentar que su trabajo muy bien 🙂 gracias
    • Sí, no hay problema. Hay así que muchos de los programadores de java por ahí que no se dan cuenta de este hecho crucial, y como usted obtener perplejo cuando el golpe de la memoria de algún tipo (pila, montón, permgen, lo que sea). Es uno de mis favoritos de las preguntas de la entrevista para averiguar si el «experto» antes de mí es lo que él dice que es 🙂
  2. 2

    Es de todos modos hay que averiguar por qué se detiene?

    Que es un poco complicado.

    Un thread de Java puede terminar por dos razones:

    • puede volver de su run() método,
    • puede terminar debido a una excepción y no se detecta en la pila del subproceso.

    Puede detectar este último caso mediante el uso de un «UncaughtExceptionHandler» para el hilo, pero el caso anterior no puede ser positivamente detectado a menos que se modifique el hilo del run() método para registrar el evento … o algo así.

    Supongo, de la otra manera de averiguar lo que está pasando sería adjuntar un depurador para la JVM y el informe de la excepción no capturada a usted.

    (Sospecho que la razón por la que no ha visto ninguna de las excepciones es que los hilos’ run métodos no son de captura /registro de todas las excepciones, Y que no tienen una excepción no capturada.)

    existe de todos modos para hacer el hilo reiniciar?

    No. No hay manera de reiniciar un Hilo que ha terminado.

    • Acabo de editar mi post para incluir la estructura de hilo, he puesto casi todo en try/catch, ¿cómo puedo implementar UncaughtExceptionHandler en mi método de ejecución?
    • 1) Que no son de la captura de excepciones de Errores. 2) Leer los javadocs para java.lang.Hilo para los métodos para establecer una excepción no capturada.
    • cierto, pero usted puede coger Arrojadiza y crear un nuevo look-a-like hilo a partir de una plantilla.
  3. 1

    Si se ejecuta desde la línea de comandos, usted puede tener volcado de los estados de todos los hilos a la consola. En windows puede hacerlo pulsando Ctrl+Break, bajo linux, mediante el envío de la señal de SALIR para el proceso de ‘matar’.

    Consulte Una Introducción a Java Seguimientos de Pila

    Enviando una señal a la Máquina Virtual de Java En plataformas UNIX puede
    enviar una señal a un programa mediante el comando kill. Este es el dejar de fumar
    la señal, que es manejado por la JVM. Por ejemplo, en Solaris puede
    utilice el comando kill-DEJAR de fumar identificador_de_proceso, donde identificador_de_proceso es el proceso
    número de su programa de Java.

    Alternativamente, usted puede introducir la secuencia de teclas \ en la ventana
    donde el programa Java se ha iniciado. El envío de esta señal indica a un
    manejador de señal en la JVM, de forma recursiva imprimir todos los
    información sobre los hilos y monitores en el interior de la JVM.

    Para generar una traza de la pila en Windows 95 o Windows NT plataformas,
    introduzca la secuencia de teclas en la ventana donde el Java
    el programa se está ejecutando, o haga clic en el botón Cerrar de la ventana.

  4. 0

    Subproceso de prioridad a uno de ellos podría ser demasiado alto, pruebe a establecer el mismo nivel a través de?
    Los interbloqueos es posible si no hay ningún tipo de control sobre cada uno y otros entre ellos.

Dejar respuesta

Please enter your comment!
Please enter your name here