Java: la diferencia entre los métodos de inicio y ejecución en Thread

1. Conozca el inicio () y la ejecución () de Thread

1。start ():

Echemos un vistazo a la introducción del método en la API:
inicie el hilo para ejecutar; la máquina virtual Java llama al método de ejecución del hilo.
El resultado son dos subprocesos que se ejecutan simultáneamente; el subproceso actual (que regresa de la llamada al método de inicio) y el otro subproceso (que ejecuta su método de ejecución).
Es ilegal iniciar un hilo varias veces. Especialmente cuando el hilo ha terminado de ejecutarse, no se puede reiniciar. Utilice el método de inicio para iniciar el subproceso, que realmente realiza una operación de subprocesos múltiples. En este momento, no es necesario esperar a que se complete la ejecución del código del cuerpo del método de ejecución y continuar ejecutando el siguiente código directamente. Inicie un hilo llamando al método start () de la clase Thread. En este momento, el hilo está en el estado listo (ejecutable) y no se está ejecutando. Una vez que se obtiene el segmento de tiempo de la CPU, se inicia el método run (), donde se llama al método run () Es el cuerpo del hilo, que contiene el contenido del hilo a ejecutar Cuando el método Run termina, el hilo termina inmediatamente.

2。run ():


Primero echemos un vistazo a la introducción de este método en la API: si el hilo se construye usando un objeto Runnable independiente, llame al método run del objeto Runnable; de ​​lo contrario, el método no hace nada y regresa.
Las subclases de Thread deben anular este método. El método run () es solo un método ordinario de la clase. Si llama al método Run directamente, todavía hay solo el hilo principal en el programa y solo hay una ruta de ejecución del programa. Debe ejecutarse secuencialmente, o se debe esperar después de que se ejecute el cuerpo del método de ejecución.Puede continuar ejecutando el siguiente código, de modo que no se logre el propósito de escribir hilos.

3. para resumir:

El subproceso se puede iniciar solo llamando al método de inicio, y el método de ejecución es solo una llamada de método ordinaria del subproceso, y se ejecuta en el subproceso principal.

Dos, ejemplos de código:

public static void main(String args[]) {
    
            
   	Thread t = new Thread() {
    
               
		 public void run() {
    
                   
  				pong();            
  		 }       
  	 };      
   	 t.start();       
     System.out.print("ping");   
}     
static void pong() {
    
           
      System.out.print("pong");   
}
 输出结果: pingpong  
public static void main(String args[]) {
    
    
        Thread t = new Thread() {
    
    
             public void run() {
    
    
                  pong();
             }
        };
       t.run();       
       System.out.print("ping");  
}     
static void pong() {
    
       
      System.out.print("pong");  
}
输出结果:pongping 

A través de los dos ejemplos de programas anteriores, puede distinguir fácilmente la diferencia entre el método start () y el método run ():
t.start (); Esta línea de código es equivalente a iniciar el hilo, t.run (); Este La línea de código es equivalente a Usar el método de ejecución en la clase t.

Tres, descripción del estado del hilo:

El estado del hilo se puede resumir como: estado inicial, estado ejecutable, estado no ejecutable y estado muerto, que se pueden subdividir en los 7 estados que se muestran en la figura anterior, que se explican a continuación:
1) Hay dos implementaciones de subprocesos. Una forma, una es heredar la clase Thread, y la otra es implementar la interfaz Runnable, pero de todos modos, cuando renovamos la instancia del subproceso, el subproceso entra en el estado inicial;
2) Cuando el objeto llama al inicio () método, ingresa al estado ejecutable Estado;
3) Después de ingresar al estado ejecutable, cuando el sistema operativo selecciona el objeto, entrará en el estado de ejecución cuando se obtenga el intervalo de tiempo de la CPU;
4) Después de ingresar al estado de ejecución, hay Hay más casos, aproximadamente de la siguiente manera:

  • Una vez que finaliza el método run () o el método main (), el hilo entra en el estado de terminación;
  • Cuando un hilo llama a su propio método sleep () o al método join () de otros hilos, entra en un estado de bloqueo (este estado detiene el hilo actual, pero no libera los recursos que posee).
  • Cuando sleep () termina o join () termina, el subproceso entra en un estado ejecutable y continúa esperando a que el sistema operativo asigne segmentos de tiempo;
  • Cuando el subproceso ingresa al estado ejecutable (tenga en cuenta que no se está ejecutando) y encuentra que el recurso que se va a llamar está bloqueado (sincronizar, bloquear), entrará inmediatamente en el estado del grupo de bloqueo, esperando adquirir la marca de bloqueo (en este tiempo, el grupo de bloqueo puede tener Con otros subprocesos esperando para adquirir la marca de bloqueo, están en el estado de cola en este momento, que es el primero en llegar, primero en ser atendido). Una vez que el subproceso obtiene la marca de bloqueo, se convierte en un estado ejecutable y espera a que el sistema operativo asigne segmentos de tiempo de CPU;
  • Cuando el hilo llama al método wait (), ingresará a la cola de espera (ingresar a este estado liberará todos los recursos ocupados, que es diferente del estado de bloqueo). Después de ingresar a este estado, no se puede despertar automáticamente. Debe confiar en otros subprocesos para llamar a notify () o El método notifyAll () solo se puede despertar (porque notificar () solo despierta un subproceso, pero no estamos seguros de qué subproceso se despierta específicamente, tal vez el subproceso que necesitamos despertar no puede ser despertado, por lo que en el uso real, generalmente use El método notificar a todos () despierta algunos subprocesos) .Después de que el subproceso se despierte, entrará en el grupo de bloqueo y esperará a que se adquiera la marca de bloqueo. Cuando el subproceso llama al método de detención, el subproceso puede entrar en el estado muerto, pero debido a que el método de detención no es seguro, se desaconseja su uso. Puede implementar la detención del subproceso cambiando las condiciones en el método de ejecución.

Supongo que te gusta

Origin blog.csdn.net/qq_47768542/article/details/109702664
Recomendado
Clasificación