El estado del hilo
Diagrama de estado del hilo:
ilustrar:
Los hilos incluyen los siguientes 5 estados.
1. Nuevo estado : después de que se crea el objeto de subproceso, ingresa al nuevo estado. Por ejemplo, Thread Thread = New Thread ().
2. Runnable: también conocido como "Estado ejecutable". Después de que se crea el objeto de subproceso, otros hilos llaman al método Start () del objeto para iniciar el hilo. Por ejemplo, Thread.Start (). Se puede programar un hilo en un estado listo para ejecutar por la CPU en cualquier momento.
3. Estado en ejecución: el hilo obtiene permisos de CPU para la ejecución. Cabe señalar que los hilos solo pueden ingresar al estado en ejecución desde el estado listo.
4. Estado bloqueado: Estado bloqueado significa que el hilo renuncia a los derechos de uso de la CPU por alguna razón y deja de funcionar temporalmente. No es hasta que el hilo ingresa al estado listo que tiene la oportunidad de ir al estado en funcionamiento. Hay tres tipos de bloqueo:
(1) Esperando bloquear: llamando al método Wait () del hilo, deje que el hilo espere la finalización de un cierto trabajo.
(2) Bloqueo sincronizado: un hilo no puede adquirir un bloqueo de sincronización sincronizado (debido a que el bloqueo está ocupado por otros hilos), ingresará a un estado de bloqueo sincronizado.
(3) Otro bloqueo: el hilo ingresará a un estado de bloqueo llamando a dormir () o unirse () del hilo o emitir una solicitud de E/S. Cuando el estado de sueño () se agotó, unirse () esperó a que el hilo termine o se agotara, o se completó el procesamiento de E/S, el hilo volvió a ingresar al estado listo.
5. Estado muerto: el hilo ha terminado de ejecutar o salir del método run () debido a una excepción, y el hilo finaliza su ciclo de vida.
Los contenidos involucrados en estos 5 estados incluyen la clase de objeto, el hilo y las palabras clave sincronizadas. Aprenderemos estos contenidos uno por uno en los siguientes capítulos.
Clase de objeto, define las funciones de sueño/vigilia como Wait (), notificar (), notifyall (), etc.
La clase de subprocesos define algunas funciones de operación de subprocesos de columna. Por ejemplo, función de sueño sleep (), interrupción () función de interrupción, getName () obtenga el nombre del hilo, etc.
Sincronized es una palabra clave; Se distingue mediante bloques de código sincronizados y métodos sincronizados. La función de sincronizado es permitir que los hilos adquieran el bloqueo de sincronización del objeto.
Cuando presentamos Wait (), notify () y otros métodos en detalle más adelante, analizaremos por qué "Wait (), notificar () y otros métodos deben definirse en la clase de objeto, no la clase de subprocesos".
Dos formas de implementar múltiples subprocesos: hilo y runnable
Runnable es una interfaz que solo contiene un método Run (). Su definición es la siguiente:
Public Interface Runnable {public abstract void run ();} El papel de Runnable, implementa múltiples subprocesos. Podemos definir una Clase A para implementar la interfaz Runnable; Luego cree un nuevo hilo a través del nuevo hilo (nuevo A ()) y otros métodos.
El hilo es una clase. Thread mismo implementa la interfaz ejecutable. Su declaración es la siguiente:
implementos de hilo de clase pública runnable {}
El papel del hilo es realizar múltiples subprocesos.
Similitudes y diferencias entre hilo y runnable:
La similitud entre Thread y Runnable: ambos son "métodos de implementación multiproceso".
Las diferencias entre hilo y runnable:
Thread es una clase, y Runnable es una interfaz; Thread en sí es una clase que implementa la interfaz ejecutable. Sabemos que "una clase solo puede tener una clase principal, pero puede implementar múltiples interfaces", por lo que Runnable tiene una mejor escalabilidad.
Además, Runnable también se puede utilizar para "compartir recursos". Es decir, se crean múltiples hilos basados en un cierto objeto ejecutable, y compartirán recursos en el objeto ejecutable.
¡En general, se recomienda implementar múltiples subprocesos a través de "Runnable"!
Ejemplos de lectura múltiple para hilo y ejecutable
1. Ejemplo de subproceso múltiple de hilo
A continuación podemos comprender mejor el hilo y la ejecución a través de ejemplos, y aprovechar un ejemplo en línea que sea más convincente. // código fuente de Java
La clase MyThread extiende el hilo {private int ticket = 10; public void run () {for (int i = 0; i <20; i ++) {if (this.ticket> 0) {system.out.println (this.getName ()+"tickets: ticket"+this.ticket--); }}}}}}; public class ThreadTest {public static void main (string [] args) {// iniciar 3 hilos t1, t2, t3; ¡Cada hilo vende 10 boletos! Mythread t1 = new MyThread (); MyThread t2 = new MyThread (); Mythread t3 = new MyThread (); t1.start (); t2.start (); t3.start (); }} Resultados de ejecución:
Hilo-0 Venta de boletos: Ticket10Thread-1 Venta de boleto: Ticket10Thread-2 Venta de boleto: Ticket10Thread-1 Venta de boleto: Ticket9Thread-0 Venta de boleto: Ticket9Thread-1 Venta de boleto: Ticket8Thread-2 Boleto Venta de boleto de Ticket9Thread-1: Ticket 7Thread-Venta de Ticket-Venta de Ticket-Venta de Ticket de Ticket 8 Ticket7Thread-1 Venta de boletos: Ticket4Thread-2 Venta de boleto: Ticket7Thread-1 Venta de boleto: Ticket3Thread-0 Boletos: Ticket6Thread-1 Entradas: Ticket2Thread-2 Boletos: Ticket6Thread-2 Entradas: Ticket5Thread-2 Entradas: Ticket4Thread-1 Tickets: Ticket1thread-00 Entradas: Ticket3Thread-0 Entradas: Ticket1Thread-0 Boletos: Ticket2Thread-0 Entradas: Ticket1Thread-0 Entradas: Ticket2Thread-0 Boletos: Ticket1
Descripción de los resultados:
(1) Mythread hereda del hilo, que es un hilo personalizado. Cada mythread vende 10 boletos.
(2) El hilo principal Main crea y comienza 3 hilos infantiles mythread. Cada hilo infantil vende 10 boletos.
2. Ejemplo multiproceso de Runnable
A continuación, modificamos el programa anterior. Implementar una interfaz a través de Runnable, implementando así múltiples subprocesos.
// runnabletest.java Código fuente de la clase myThread implementos runnable {private int ticket = 10; public void run () {for (int i = 0; i <20; i ++) {if (this.ticket> 0) {system.out.println (thread.currentThread (). getName ()+"Venta de tickets: ticket"+this.Ticket--); }}}}}; public class runnabletest {public static void main (string [] args) {mythread mt = new mythread (); // Inicie 3 hilos T1, T2, T3 (comparten un objeto ejecutable), ¡y estos 3 hilos venden un total de 10 boletos! Hilo t1 = nuevo hilo (mt); Hilo t2 = nuevo hilo (mt); Hilo t3 = nuevo hilo (mt); t1.start (); t2.start (); t3.start (); }} Resultados de ejecución:
Hilo-0 Venta de boleto: Ticket10Thread-2 Venta de boleto: Ticket8Thread-1 Venta de boleto: Ticket9Thread-2 Venta de boleto: Ticket6Thread-0 Venta de boleto: Ticket7Thread-2 Venta de boleto: Ticket4Thread-1 Venta de boleto: Ticket5Thread-2 Venta de ticket: Ticket2thread-0 Venta de ticket: Ticket3Thread-1 Venta de boleto: Venta de boleto:
Descripción de los resultados:
(1) A diferencia del anterior "Mythread hereda del hilo"; Aquí MyThread implementa la interfaz de hilo.
(2) El hilo principal principal crea e inicia 3 hilos infantiles, y estos 3 hilos infantiles se crean en función de "MT, objeto ejecutable". El resultado de la operación es que estos 3 hilos infantiles vendieron un total de 10 boletos. Esto significa que comparten la interfaz mythread.