Entender hilos
concepto
Un hilo es el hilo de ejecución en el programa. La máquina virtual Java permite que las aplicaciones ejecutaran múltiples hilos de ejecución simultáneamente.
Características del hilo
Tiene un estado, que representa el estado de un hilo. Al mismo tiempo, un hilo en el JVM tiene solo un estado;
·NUEVO
Hilos que aún no se han iniciado (hilos que no se han iniciado desde el inicio de la ejecución del programa)
・ Runnable
Un hilo ejecutable que se ejecuta en el JVM, pero puede estar esperando otros recursos, como la CPU.
·OBSTRUIDO
Bloqueo de hilo, esperando que un bloqueo permita que continúe funcionando
·ESPERA
Infinite Wait (ejecute nuevamente en un hilo que se basa en permitir que ingrese a ese estado para realizar una operación específica)
・ Timed_waiting
Espera cronometrada (ejecute nuevamente en un hilo que se basa en dejar que ingrese ese estado para una operación específica dentro de un tiempo de espera especificado)
·FINALIZADO
Hilo salido
Tener prioridad y determinar la orden de ejecución de los hilos;
Un número entero entre 1 y 10, el valor predeterminado es 5. Cuanto mayor sea el valor, mayores serán las posibilidades de ejecución y la prioridad no determina la orden de ejecución del hilo.
La prioridad del hilo infantil es la misma que la del hilo principal de forma predeterminada.
Tenga en cuenta que el JVM dejará de ejecutar todos los hilos cuando:
Se llama al método Exit () de tiempo de ejecución (tiempo de ejecución) y Security Manager permite la llamada del método;
Todos los "hilos no dademon" han dejado de funcionar (independientemente de si se detienen normalmente o si se detienen);
Se puede marcar como un demonio (demonio)
El hilo infantil del hilo del demonio sigue siendo el hilo de demonio;
El hilo de demonio también es el "subproceso de backend", que generalmente se usa para ejecutar tareas de fondo, mientras que el subproceso del usuario generalmente ejecuta tareas a nivel de usuario.
Métodos para terminar el hilo
1. Use el indicador de salida para hacer la salida del hilo normalmente, es decir, el hilo termina después de completar el método de ejecución.
Cuando se ejecuta el método de ejecución, el hilo saldrá. Pero a veces el método de ejecución nunca termina. Por ejemplo, el uso de hilos para escuchar las solicitudes de los clientes en programas de servidor u otras tareas que requieren procesamiento de bucle. En este caso, estas tareas generalmente se colocan en un bucle, como el bucle mientras. Si desea que el bucle se ejecute para siempre, puede usar while (true) {...} para manejarlo. Sin embargo, si desea realizar la salida del bucle While en una determinada condición, la forma más directa es establecer un indicador de tipo booleano y controlar si el bucle While sale configurando este indicador en verdadero o falso. Aquí hay un ejemplo de terminar un hilo usando el indicador de salida.
Flagexitthread.java
paquete com.rainmonth;/*** creado por Randyzhang en 2017/3/23.*/public class FlagexitThread extiende Thread {public volatile boolean isExit = false; public flagexitThread (string name) {super (nombre);}}@anular public void run () {while (! esxit) {system.println ("mando" mando ");Democlient.java
paquete com.rainmonth;/*** creado por Randyzhang el 2017/3/23.*/public class Democlient {public static void main (string [] args) {system.out.println ("instancia de hilo terminal elegante"); exitbyflag (); // exitbyinterrupt ();} private void exitbyflag () {fLageflAp = new FlagexitThread (flaGexitThread.class.getSimplename ()); FlagexitThread (); try {Thread.sleep (1000); FlagexitThread.isExit = true; FlaGexitThread.join (); System.out.println ("Thread");} Catch (InterruptedException E) {E.PrintStackTrace ();}} privado estático void exitByInterrump () {flaGexitThread flaGexitThread = new FlagexitThread (flaGexitThread.class.getSimplename ()); System.out.println ("FlagexitThread Running ..."); FLAGEXITTHREAD {Thread.sleep (1500); System.out.println ("FlagexitThread interrumpió ..."); FlaGexitThread.interrupt (); Thread.sleep (1500); System.out.println ("Stop Aplication ...");} Catch (InterruptEdException e) {E.PrintStackTrace ();}}}}}}}}}}}}}}}}}}}}}Resultado de salida:
Imprima un montón de estoy ejecutando después de que sale el hilo.
2. Use el método de parada para terminar con fuerza el hilo (este método no se recomienda, porque la parada es la misma que la suspensión y el reanudación, y también puede tener resultados impredecibles).
Muestra el método de parar (). La descripción de stop () en el código fuente es la siguiente:
/** Este método es inherentemente inseguro. Detener un hilo con* hilo. La parada hace que desbloquee todos los monitores que* ha bloqueado (como una consecuencia natural de la excepción de* <code> threaddeath </code> que se propaga la pila). Si* alguno de los objetos previamente protegidos por estos monitores estaba en* un estado inconsistente, los objetos dañados se vuelven visibles para* otros hilos, lo que potencialmente resultó en un comportamiento arbitrario. Muchos* usos de <code> stop </code> deben reemplazarse por código que simplemente* modifique alguna variable para indicar que el hilo de destino debe* dejar de ejecutar. El hilo de destino debe verificar esta variable* regularmente y volver de su método Ejecutar de manera ordenada* si la variable indica que debe dejar de funcionar. Si el hilo de destino* espera períodos largos (en una variable de condición,* por ejemplo), el método <code> interrupt </code> debe usarse para* interrumpir la espera.*/
El significado general es que la inseguridad del método es inherente. Llamar a Stop () para finalizar un hilo liberará todos los monitores que ha bloqueado (esto causará la excepción de Threaddeath que se propagará hacia arriba a lo largo de la pila para ser revisada para ser lanzada). Si hay una inconsistencia en los objetos previamente protegidos por estos monitores liberados y estos objetos son visibles para otros hilos, esto conducirá a algunas consecuencias inesperadas. Lo que debe detener las operaciones se reemplazará por un código que solo necesita modificar cierto código para indicar que el hilo de destino debe dejar de ejecutarse (el método 1 es de esta manera). Si el hilo de destino espera una determinada condición (como una determinada variable de condición) durante mucho tiempo, debemos usar el método de interrupción para interrumpir la espera (este es el método del método 3).
3. Use el método de interrupción para interrumpir el hilo.
La interrupción literalmente significa terminar, pero no intente terminar el hilo llamando a la interrupción, porque a veces incluso si llama al método, el hilo continuará ejecutándose. Puede comentar el método ExitByFlag () anterior, habilitar el método ExitByInterrupt () y encontrar que el método de interrupción () se llama a tiempo, y estoy ejecutando ... (los resultados de diferentes sistemas y CPU pueden ser diferentes). Se puede ver que no es seguro usar el método de interrupción.
Resumir
Según el análisis anterior, el método más recomendado es el primero. Podemos establecer banderas usando variables compartidas y enviar señales para informar al hilo que debe terminar. Por supuesto, debemos asegurarnos de que las operaciones de esta variable compartida sean sincrónicas.
Lo anterior es todo el contenido de este artículo sobre la instancia de hilo de terminación Java y la lectura del código fuente de método stop (). Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!