A veces, los colgantes de hilo son útiles. Por ejemplo, se puede usar un hilo separado para mostrar la hora del día. Si el usuario no quiere usar el reloj, el hilo está suspendido. En cualquier caso, suspender el hilo es muy simple, y una vez que está suspendido, reiniciar el hilo también es un asunto simple.
Los mecanismos para suspender, terminar y restaurar hilos difieren en Java 2 y versiones anteriores. Aunque usa Java 2 para escribir código, aún debe comprender cómo se hicieron estas operaciones en el entorno de Java temprano. Por ejemplo, es posible que deba actualizar o mantener un código antiguo. También debe entender por qué Java 2 tiene tales cambios. Por estas razones, lo siguiente describe el método original para ejecutar el control de subprocesos, seguido del método Java 2.
Pausa, recuperación y terminación de hilos en Java 1.1 o antes
Antes de la versión Java2, el programa usa suspensión () y reanudar () de hilo para detener y reiniciar hilos. Están en forma de:
Final void suspend () currículum void final ()
El siguiente procedimiento describe estos métodos:
// Uso de suspensión () y reanudar (). Clase NewThread Runnable {String Name; out .println ("nuevo hilo:" + t); i> 0; ":::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::: ¿ :::::::::::::::: áltoo; newThread ("One"); .Seep (1000); Sleep (1000); Espere a que los hilos finalicen {System.out.println ("Esperando que los hilos terminen"); println ("Hilo principal interrumpido"); Parte de la salida del programa es la siguiente:
Nuevo hilo: hilo [uno, 5, principal] uno: 15 nuevo hilo: hilo [dos, 5, main] dos: 15one: 14two: 14one: 13two: 13one: 12two: 11two: 11 hilo de súbdito onetwo: 10two: 9two: 8two: 7TWO: 6 Resumen de subprocesos de subprocesos de subspending TwoOnone: 10One: 9One: 8One: 7One: 6 Resumen de hilo Dawoweiting para que los hilos terminen. Two: 5One: 5Two: 4one: 4Two: 3One: 3 dos: 2one: 2two: 1one: 1Two . Main Hilo sale.
La clase de hilo también define stop () para terminar el hilo. Su forma es la siguiente:
parada nula ()
Una vez que se termina el hilo, no se puede reanudar mediante reanudar () para continuar ejecutándose.
Suspender, restaurar y terminar hilos en Java
Los métodos de suspensión (), resumido () y stop () de hilo parecen ser formas perfectas y convenientes de administrar hilos, y no pueden usarse en nuevas versiones de Java de programas. Aquí están las razones. El método suspend () de la clase de subprocesos no se favorece en Java2, porque suspender () a veces puede causar fallas graves del sistema. Suponiendo que se bloquea un hilo para una estructura de datos crítica, si el hilo está suspendido allí, los hilos bloqueados no renuncian al control del recurso. Otros hilos que esperan estos recursos pueden estar bloqueados.
El método de reanudar () tampoco está aprobado. No causa problemas, pero no se puede usar de forma independiente sin el método suspender (). El método stop () de la clase de hilo también se opone en Java 2. Esto se debe a que este método puede causar fallas graves del sistema. Imagine que un hilo está escribiendo una estructura de datos precisa e importante y completando solo una fracción de la misma. Si el hilo termina en este momento, la estructura de datos puede permanecer en un estado de bloqueo.
Debido a que en Java 2, los métodos de suspensión (), reanudar () y detener () no se pueden usar para controlar los hilos, puede pensar que no hay forma de detener, restaurar y finalizar los hilos. En realidad, no es el caso. En cambio, el hilo debe diseñarse para que el método Run () verifique periódicamente si el hilo debe suspenderse, reanudar o terminar su propia ejecución. Representativamente, esto se hace estableciendo una variable de indicador que indica el estado del hilo. Mientras el indicador esté configurado en "Ejecutar", el método run () debe continuar ejecutándose por el hilo. Si la bandera está "suspendida", el hilo debe estar detenido. Si se establece en "parar", el hilo debe finalizarse.
Por supuesto, hay muchas formas de escribir dicho código, pero el tema central debería ser el mismo para todos los programas.
Los siguientes ejemplos ilustran cómo los métodos Wait () y notificar () heredaron del control de objeto la ejecución de los subprocesos. Este ejemplo es muy similar al programa mencionado anteriormente. Sin embargo, ninguno de los métodos que no están aprobados son útiles. Pensemos en la ejecución del programa.
La clase NewTread contiene la variable de instancia suspendida utilizada para controlar la ejecución de un hilo. El constructor lo inicializa a falso. El método Run () contiene un bloque que monitorea la declaración de sincronización de SUSPENDFLAG. Si la variable es verdadera, se llama al método Wait () para suspender el hilo. El método mysuspend () establece suspenderflag a verdadero. El método MyResume () establece suspenderflag en falso y llama al método notify () para evocar el hilo. Finalmente, el método Main () se modifica para llamar a los métodos mysuspend () y MyResume ().
// La suspensión y la recuperación de un hilo para Java2Class NewThread Runnable {Nombre de la cadena; out .println ("nuevo hilo:" + t); t i = 15; }}} Catch (InterruptedException e) {System.out.println (nombre + "interrumpido"); void myresume () {suspendflag = false; ; Thread One "); ob2.mysuspend (); system.out.println (" suspender el hilo dos "); thread.sleep (1000); ob2.myresume (); system.out.println (" hilo de reanudación t wo ") ; T.JOIN (); }La salida de este programa es la misma que la del programa anterior. Más adelante en este libro, verá más ejemplos de uso del mecanismo Java 2 para controlar los hilos. Sin embargo, aunque este mecanismo no es tan "limpio" como el método anterior, es la forma de garantizar que no ocurran errores en tiempo de ejecución. Es el método que debe tomar todo el código nuevo.