Este artículo sigue el artículo anterior "Explicación detallada de los ejemplos de Java Multithreading (i)".
4. El estado de bloqueo y el control de hilo de Java Multithreads
Se han mencionado varios tipos específicos de bloqueo de Java anteriormente. Echemos un vistazo a los métodos principales que causan el bloqueo de hilo de Java.
1. JOIN ()
Únase: deje que un hilo espere a que se complete otro hilo antes de continuar la ejecución. Si el hilo A se llama en el método de hilo B unión () en el cuerpo de ejecución de subprocesos, el hilo A está bloqueado y solo después de que se sabe que el hilo B ha completado la ejecución de Thread B, A puede continuar ejecutándose.
public class Threadtest {public static void main (string [] args) {myrunnable myrunnable = new MyRunnable (); Hilo de hilo = nuevo hilo (myrunnable); for (int i = 0; i <100; i ++) {System.out.println (Thread.CurrentThread (). GetName () + "" + I); if (i == 30) {thread.start (); intente {thread.Join (); // El hilo principal debe esperar a que el hilo se ejecute antes de continuar ejecutando} Catch (InterruptedException e) {E.PrintStackTrace (); }}}}}}}}}}}}}}}}}}}}}}}}2.sleep ()
Sleep: deje que el hilo de ejecución actualmente pause el tiempo especificado e ingrese a un estado de bloqueo. Durante el período de tiempo que duerme, el hilo no tendrá la oportunidad de ejecutar porque no está en el estado listo. Incluso si no hay otros hilos ejecutables en el sistema en este momento, los hilos en el sueño () no se ejecutarán. Por lo tanto, el método Sleep () a menudo se usa para detener la ejecución del hilo.
Como se mencionó anteriormente, cuando se llama el método Start () del hilo recién creado, el hilo ingresa al estado listo y puede obtener el porta de tiempo de la CPU en algún momento para ejecutarse. Si desea que el nuevo hilo se ejecute inmediatamente con cierta necesidad, simplemente llame a dormir (1) del hilo original directamente.
public class Threadtest {public static void main (string [] args) {myrunnable myrunnable = new MyRunnable (); Hilo de hilo = nuevo hilo (myrunnable); for (int i = 0; i <100; i ++) {System.out.println (Thread.CurrentThread (). GetName () + "" + I); if (i == 30) {thread.start (); intente {Thread.sleep (1); // Asegúrese de que se ejecute inmediatamente} Catch (InterruptedException e) {E.PrintStackTrace (); }}}}}}}}}}}}}}}}}}}}}}}}Nota: Dormir durante un milisegundo es suficiente, porque la CPU no estará inactiva y cambiará al hilo recién creado.
3. Hilo de fondo (hilo de demonio)
Concepto/propósito: los hilos de fondo proporcionan principalmente servicios a otros hilos (relativamente llamados hilos de primer plano) o "hilos de demonio". Como el hilo de recolección de basura en el JVM.
Ciclo de vida: el ciclo de vida de un hilo de fondo está relacionado con el ciclo de vida del hilo de primer plano. Se refleja principalmente en: cuando todos los hilos de primer plano entran en el estado muerto, el hilo de fondo morirá automáticamente (de hecho, esto es fácil de entender, porque el propósito del hilo de fondo es servir el hilo de primer plano. Dado que todos los hilos de primer plano han muerto, de qué es lo que lo mantiene ... ¡genial!).
Configuración del hilo de fondo: llamar al método SetDaemon (True) del objeto de subprocesos puede establecer el hilo especificado como un hilo de fondo.
public class Threadtest {public static void main (string [] args) {Thread myThread = new MyThread (); para (int i = 0; i <100; i ++) {System.out.println ("Hilo principal i ="+i); if (i == 20) {mythread.setDaemon (true); mythread.start (); }}}}}} La clase MyThread extiende el hilo {public void run () {for (int i = 0; i <100; i ++) {system.out.println ("i ="+i); intente {Thread.sleep (1); } Catch (InterruptedException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); }}}}Determine si el hilo es un hilo de fondo: llame al método isDeamon () del objeto de subproceso.
Nota: El hilo principal es el hilo de primer plano de forma predeterminada, el hilo infantil creado en el primer plano de la creación del hilo es el hilo de primer plano de forma predeterminada, y el hilo creado en el hilo de fondo es el hilo de fondo de forma predeterminada. Al llamar al método SetDeamon (True) para establecer el hilo de primer plano como un hilo de fondo, debe ser antes de llamar al método Start (). Después de que los hilos murieron el día antes de ayer, el JVM notifica al hilo de fondo para morir, pero lleva una cierta cantidad de tiempo recibir las instrucciones para responder.
4. Cambie la prioridad de hilos/setpriority ():
Cada hilo tiene una cierta prioridad al ejecutar, y los hilos con alta prioridad tienen más oportunidades de ejecución. Cada hilo tiene la misma prioridad que el hilo que lo creó. El hilo principal tiene prioridad normal por defecto.
Establecer prioridad del hilo: setpriority (int priorityLevel). El rango de nivel de prioridad del parámetro está entre 1-10, y los tres valores constantes estáticos comúnmente utilizados son los siguientes:
Max_priority: 10
Min_priority: 1
Norm_priority: 5
Obtenga prioridad del hilo: getPriority ().
Nota: Un objeto de subproceso con mayor prioridad del hilo solo significa que este hilo tiene más oportunidades de ejecución, en lugar de la ejecución de prioridad.
public class Threadtest {public static void main (string [] args) {Thread myThread = new MyThread (); para (int i = 0; i <100; i ++) {System.out.println ("Hilo principal i ="+i); if (i == 20) {mythread.setPriority (Thread.max_priority); mythread.start (); }}}}}} La clase MyThread extiende el hilo {public void run () {for (int i = 0; i <100; i ++) {system.out.println ("i ="+i); }}}5. Concesiones de hilo: rendimiento ()
El papel básico de rendimiento () se ha discutido en la publicación de blog anterior. Al mismo tiempo, el método de rendimiento () también está relacionado con la prioridad del hilo. Cuando un hilo llama al método Eille () para cambiar del estado en ejecución al estado listo, la CPU solo seleccionará los subprocesos con la misma prioridad o mayor prioridad que el hilo de la cola de subproceso de estado listo para ejecutar.
public class ThreadTest {public static void main (string [] args) {Thread myThread1 = new MyThread1 (); Thread myThread2 = new MyThread2 (); mythread1.setPriority (Thread.max_priority); mythread2.setPriority (Thread.min_priority); para (int i = 0; i <100; i ++) {System.out.println ("Hilo principal i ="+i); if (i == 20) {mythread1.start (); mythread2.start (); Thread.yield (); }}}}}} La clase MyThread1 extiende el hilo {public void run () {for (int i = 0; i <100; i ++) {system.out.println ("mythread 1 - i ="+i); }}} clase MyThread2 extiende el hilo {public void run () {for (int i = 0; i <100; i ++) {system.out.println ("mythread 2 - i ="+i); }}}Serie de artículos:
Explicación de las instancias de Java Multi-Thread (I)
Explicación detallada de las instancias de Java Multi-Thread (ii)
Explicación detallada de las instancias de Java Multi-Thread (iii)