Aprendizaje de subprocesos múltiples de Java (1) subproceso de Java Ejecutable, Subproceso, Invocable, FutureTask

La forma en que se crea el hilo

1.Objeto de hilo

1.1 Heredar el objeto Thread

@Slf4j
public class MyThread extends Thread{
    
    
    @Override
    public void run() {
    
    
        // 线程要执行的内容
        log.debug("继承Thread方式");
    }
}

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        new MyThread().start(); // 启动线程
    }
}

1.2 Usar el objeto Thread directamente

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        Thread t = new Thread(){
    
    
            @Override
            public void run() {
    
    
                log.debug("线程执行");
            }
        };
        t.start();
    }
}

2.Interfaz ejecutable

public class MyThread implements Runnable{
    
    
    @Override
    public void run() {
    
    
        // 该线程执行内容
        System.out.println("线程执行");
    }
}

public static void main(String[] args) {
    
    
        MyThread myThread = new MyThread();
        Thread t1 = new Thread(myThread, "t1");
        t1.start();

        // jdk8 Lambda
        Thread t2 = new Thread(()->{
    
     System.out.println("t2执行");}, "t1");
        t2.start();

        Runnable runnable = ()->{
    
     System.out.println("t3执行"); };
        Thread t3 = new Thread(runnable, "t3");
        t3.start();
    }

3. La relación entre Runnable y Thread

Runnable debe pasarse a Thread para su ejecución

      Runnable runnable = ()->{
    
     System.out.println("t3执行"); };
      Thread t3 = new Thread(runnable, "t3");
      t3.start();

Haga clic en el código fuente de Thread y descubra que Runnable se pasará a un método de inicio

https://img-blog.csdnimg.
Se encuentra que init se pasa a otro init.
Inserte la descripción de la imagen aquí
Se encuentra que el método init ha pasado una variable de sí mismo

Inserte la descripción de la imagen aquí
Se encuentra que el método run () en la clase Thread finalmente llama al método run de este Runnable

Inserte la descripción de la imagen aquí

La ejecución de Runnable es, en última instancia, la ejecución de Thread. Si el método de ejecución de Thread no se vuelve a ejecutar, el método de ejecución de Thread determinará primero si se ha pasado Runnable y, de ser así, ejecutará el método de ejecución de Runnable.

3.Invocable 和 FutureTask

FutureTask implementa RunnableFuture

public class FutureTask<V> implements RunnableFuture<V>

RunnableFuture hereda Runnable y Future

public interface RunnableFuture<V> extends Runnable, Future<V>

Es decir, FutureTask también se puede considerar como Runnable, pero es más fuerte que Runnable
porque hereda el método en Future, lo que le da la capacidad de obtener resultados de ejecución de subprocesos.
Inserte la descripción de la imagen aquí
Invocable es solo una interfaz. Su llamada y los métodos de ejecución Runnable son similares en naturaleza, y todos son subprocesos. Ejecute el código en él, pero la llamada tiene un valor de retorno genérico y también puede lanzar excepciones. El método de ejecución no tiene excepciones y debe ser digerido internamente.

Inserte la descripción de la imagen aquí

Pero cuando ejecutamos el código, todavía usamos el método de inicio. Todavía ejecuta el método de ejecución, pero descubrimos que no reescribimos el método de ejecución sino un método de llamada.

Inserte la descripción de la imagen aquí

Haga clic en la clase FutureTask y descubra que ha anulado el método de ejecución interno.Cuando iniciamos el hilo en el inicio, el método de ejecución llamará al método de llamada del Invocable entrante y manejará la excepción aquí. El valor se devuelve al método set de FutureTask para la llamada de get y otros métodos

Inserte la descripción de la imagen aquí

El valor se devuelve a la variable resultado.

Inserte la descripción de la imagen aquí
Cuando se llama al método get, se llama al método de informe
Inserte la descripción de la imagen aquí
. El retorno del método es el valor de la llamada al método de ejecución.

Inserte la descripción de la imagen aquí
Tenga en cuenta
Inserte la descripción de la imagen aquí
que el método get tiene un valor de retorno, lo que significa que se bloqueará hasta que el hilo regrese de forma asincrónica.

Supongo que te gusta

Origin blog.csdn.net/qq_43539962/article/details/109300838
Recomendado
Clasificación