Resumen de Java conocimiento común (⑬) - Hilo

Java multi-hilo programación para proporcionar una función de apoyo. Un hilo refiere a un único flujo de control de una secuencia de proceso, un proceso puede complicarse por una pluralidad de hilos, cada hilo en paralelo para realizar diferentes tareas.

Multihilo es una forma especial de la multitarea, multihilo, pero el uso de una sobrecarga de recursos más pequeña.

Otro término se define en el presente documento y el hilo asociado - procesos: un proceso que incluye la asignación de espacio de memoria por el sistema operativo, que comprende uno o más hilos. Un hilo separado no puede existir, debe ser parte del proceso. Un procedimiento ha sido ejecutado, para terminar hasta después de que todos los hilos no daemon tener funcionamiento acabado.

Multihilo puede satisfacer a los programadores a escribir programas eficientes para lograr la plena utilización de la CPU.

A. Un hilo de ciclo de vida

Un hilo es un proceso dinámico de ejecución, sino que también tiene un proceso desde la creación hasta la muerte.

Nueva Estado : Después de establecer un objeto hilo y la nueva clase Thread palabra clave o subclase, el hilo se encuentra en el nuevo estado del objeto. Permanece en este estado hasta el inicio del programa () este hilo.

** estado preparado: ** Cuando un objeto hilo para llamar al método start (), el hilo en el estado preparado. hilo listo en la cola de listos, esperando para programar el programador de subprocesos JVM.

Estado de funcionamiento : Si el hilo se pone el estado listo de los recursos de la CPU, puede realizar run (), el hilo va a correr en este momento. Hilo conductor a los más complejos, puede convertirse en estado bloqueado, estado preparado, y el estado de la muerte.

estado de bloqueo : Si un hilo se ejecuta después del sueño (sueño), suspender (pendiente) y otros métodos, la pérdida de recursos ocupados, el hilo entra en el estado bloqueado de la corriente. En el tiempo de sueño ha llegado a conseguir el equipo o los recursos pueden volver a entrar en el estado listo. Se puede dividir en tres tipos:

  • A la espera de bloqueo: hilos de ejecución estado de ejecución del método wait (), el hilo se bloquea esperando para entrar en el estado.
  • bloqueo sincrónico: se sincronizan fallo de bloqueo de sincronización de subprocesos (porque otro bloqueo de sincronización hilo está ocupada).
  • Otro bloqueo: Emita la solicitud de E / S, el hilo entrará en el estado bloqueando el hilo del sueño llamando al () o unirse a (). Cuando el sueño () de tiempo de espera, la espera de Ingreso () para un hilo de terminar o un tiempo de espera, o I / O se ha completado el procesamiento, el hilo en el estado listo de nuevo.

El estado de la muerte : un hilo para completar la tarea de dirigir se produce la condición de terminación del estado u otra, el hilo pasa a la terminación del estado.

Thread.run () y hilo.start () la diferencia entre :

  • iniciar () para iniciar un hilo, verdaderamente operación multi-hilo. A continuación, sin esperar a que el código cuerpo del método de ejecución se ha completado, se puede proceder directamente a la siguiente código; para iniciar un hilo llamando al método de la clase Entrada de rosca (), entonces este hilo no está en estado de servicio y no se está ejecutando. A continuación, este método llama a la carrera clase Thread () para completar su operación de ejecución, en el que el método run () se llama cuerpo de hilo, que contiene el contenido de este hilo para ser ejecutados, terminando el método Run para ejecutar este hilo para terminar. Entonces CPU reprogramación de otros hilos.
  • Llamar al método run () como un método regular de forma. Para realizar un procedimiento o pedidos, para esperar a que el método de ejecución después de la implementación de la misma, para proceder con el siguiente código; este programa, sólo el hilo principal es un hilo, que es único camino de ejecución del programa una, así que no hay propósito de hilos de escritura.

II. La diferencia entre el sueño y espera

Estos dos métodos son de diferentes categorías: el sueño de la clase Thread, clase de objeto de la espera. el sueño es un método estático de la rosca, que se llamaba a que vayan a la cama, aunque el método de llamada b del sueño en un hilo, de hecho, sigue siendo un ir a dormir, sea b hilos duermen, de código para llamar a la b.

Lock: el sueño es el método más importante no es liberar el bloqueo, el método de espera de liberación de bloqueo, de modo que otros hilos pueden ser utilizados o un método de un bloque de control de sincronización. ** sueño no vender los recursos del sistema; espera está a la espera para entrar en el grupo de subprocesos que esperar y dejar que los recursos del sistema, otros hilos pueden ocupar la CPU. ** esperar generalmente no aumentará el límite de tiempo, porque se corre un hilo de espera de recursos no es suficiente, entonces es inútil esperar a que las otras llamadas hilo notificar / notifyAll despierta todos los hilos esperando en la piscina, entrará en la cola de listos esperando sistema de distribución de OS recursos. sueño (milisegundos) se puede especificar el tiempo por lo que activará automáticamente, sólo puede ser llamado si es menor de interrupción () interrumpida por la fuerza. Papel Thread.sleep (0) está "sistema operativo inmediatamente dispara una competición re-CPU."

Rango: espera, notificar y notifyAll único método de control de sincronización para controlar la sincronización o un bloque (el sincronizado) que se utiliza en él, pero se puede utilizar en cualquier parte del sueño:

   synchronized(x){ 
      x.notify() 
     //或者wait() 
   }
复制代码

Prioridad III. Tema

Cada hilo de Java tiene una prioridad, lo que ayuda a determinar el orden de programación de hilos del sistema operativo.

prioridad de hebra Java es un número entero que va de 1 (Thread.MIN_PRIORITY) - 10 (Thread.MAX_PRIORITY).

Por defecto, cada hilo se le asigna una prioridad NORM_PRIORITY (5).

De rosca con una prioridad más alta es más importante para el programa, y ​​debería asignar recursos del procesador antes de bajar subproceso de prioridad. Sin embargo, la orden no garantiza hilo de rosca prioridad de ejecución, sino también muy dependiente de la plataforma.

IV. Creación de un hilo

Java proporciona tres formas de crear hilos:

  • Mediante la implementación de la interfaz Ejecutable;
  • A través de herencia misma clase Thread;
  • Crear un hilo a través rescatable y futuro.

Mediante la implementación de la interfaz Ejecutable

class RunnableDemo implements Runnable {
   private Thread t;
   private String threadName;
   
   RunnableDemo( String name) {
      threadName = name;
      System.out.println("Creating " +  threadName );
   }
   
   public void run() {
      System.out.println("Running " +  threadName );
      try {
         for(int i = 4; i > 0; i--) {
            System.out.println("Thread: " + threadName + ", " + i);
            // 让线程睡眠一会
            Thread.sleep(50);
         }
      }catch (InterruptedException e) {
         System.out.println("Thread " +  threadName + " interrupted.");
      }
      System.out.println("Thread " +  threadName + " exiting.");
   }
   
   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}
 
public class TestThread {
 
   public static void main(String args[]) {
      RunnableDemo R1 = new RunnableDemo( "Thread-1");
      R1.start();
      
      RunnableDemo R2 = new RunnableDemo( "Thread-2");
      R2.start();
   }   
}
复制代码

A través de herencia misma clase Thread

class ThreadDemo extends Thread {
   private Thread t;
   private String threadName;
   
   ThreadDemo( String name) {
      threadName = name;
      System.out.println("Creating " +  threadName );
   }
   
   public void run() {
      System.out.println("Running " +  threadName );
      try {
         for(int i = 4; i > 0; i--) {
            System.out.println("Thread: " + threadName + ", " + i);
            // 让线程睡眠一会
            Thread.sleep(50);
         }
      }catch (InterruptedException e) {
         System.out.println("Thread " +  threadName + " interrupted.");
      }
      System.out.println("Thread " +  threadName + " exiting.");
   }
   
   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}
 
public class TestThread {
 
   public static void main(String args[]) {
      ThreadDemo T1 = new ThreadDemo( "Thread-1");
      T1.start();
      
      ThreadDemo T2 = new ThreadDemo( "Thread-2");
      T2.start();
   }   
}
复制代码

Crear un hilo a través de Callable y Futuro

  • Crear clase de implementación de interfaz invocable, y el método implementa la llamada (), el método call () como un hilo de ejecución, y los valores de retorno.
  • Callable crear una instancia de la clase de implementación, utilizando envases Callable FutureTask objeto de clase, que encapsula objeto FutureTask Callable objeto de la llamada () devuelve el valor.
  • Uso FutureTask objeto Thread como un objeto de destino para crear e iniciar un nuevo hilo.
  • método Call FutureTask objeto get () para obtener el valor de retorno después del final de la ejecución sub-hilo.
public class CallableThreadTest implements Callable<Integer> {
    public static void main(String[] args)  
    {  
        CallableThreadTest ctt = new CallableThreadTest();  
        FutureTask<Integer> ft = new FutureTask<>(ctt);  
        for(int i = 0;i < 100;i++)  
        {  
            System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i);  
            if(i==20)  
            {  
                new Thread(ft,"有返回值的线程").start();  
            }  
        }  
        try  
        {  
            System.out.println("子线程的返回值:"+ft.get());  
        } catch (InterruptedException e)  
        {  
            e.printStackTrace();  
        } catch (ExecutionException e)  
        {  
            e.printStackTrace();  
        }  
  
    }
    @Override  
    public Integer call() throws Exception  
    {  
        int i = 0;  
        for(;i<100;i++)  
        {  
            System.out.println(Thread.currentThread().getName()+" "+i);  
        }  
        return i;  
    }  
}
复制代码

Comparación de tres métodos para crear hilos

  • Cuando el uso de crear múltiples hilos para lograr Ejecutable, medios de interfaz que se puede llamar, implementa la clase subproceso de interfaz Ejecutable o simplemente interfaz invocable, también se puede heredar de otras clases.
  • Cuando se crea una clase Thread uso herencia multi-roscado, sencillo de preparar, si necesita acceso a la hebra actual, que no es necesario utilizar el método () Thread.currentThread, el uso directo de este para obtener el hilo actual.

Varios conceptos principales V. hilo

En la programación de subprocesos múltiples, es necesario comprender los siguientes conceptos:

  • sincronización hilo
  • la comunicación entre hilos
  • interbloqueo de subproceso
  • El hilo de control: suspender, detener y reanudar

VI. Uso multiproceso

La clave para el uso eficaz de múltiples hilos es entender el programa se ejecuta al mismo tiempo en lugar de realizarse en serie. Por ejemplo: Hay dos sub-programas requieren la ejecución concurrente, esta vez lo que necesita para tomar ventaja de la programación multi-roscado.

Mediante el uso de múltiples hilos, se puede escribir un programa muy eficiente. Sin embargo, tenga en cuenta que si crea demasiados hilos, la eficiencia de la ejecución del programa es realmente reducido, en lugar de mejorarse.

Recuerde, el cambio de contexto sobrecarga es también muy importante, si crea demasiados hilos, tiempo de CPU gastado en el tiempo el cambio de contexto de la ejecución del programa!

Supongo que te gusta

Origin juejin.im/post/5e64eb896fb9a07cc10ab03e
Recomendado
Clasificación