Java multithreading-1
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
Se encuentra que init se pasa a otro init.
Se encuentra que el método init ha pasado una variable de sí mismo
Se encuentra que el método run () en la clase Thread finalmente llama al método run de este Runnable
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.
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.
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.
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
El valor se devuelve a la variable resultado.
Cuando se llama al método get, se llama al método de informe
. El retorno del método es el valor de la llamada al método de ejecución.
Tenga en cuenta
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.