Subprocesos múltiples avanzados de Java (1)

1. Multihilo

1. Heredar la clase Thread (método 1)

1) Implementar subprocesos múltiples

Herede la clase Thread,
anule el método run(),
cree un objeto thread y
llame al método start() para comenzar

Llamar al método de ejecución se ejecutará como un método normal, y solo llamar al método de inicio iniciará un nuevo hilo para su ejecución.

2) Ventajas y desventajas

  • ventaja

La codificación es simple

  • defecto

Es una herencia única.Después de que la clase thread hereda Thread, no puede heredar otras clases, lo cual no es fácil de extender.

2. Implementar la interfaz Runnable (método 2)

1) Implementar subprocesos múltiples

Defina una clase de tarea de hilo MyRunnable para implementar la interfaz Runnable, reescriba el método run(),
cree un objeto MyRunnable
, entregue el objeto de tarea MyRunnable al objeto de hilo Thread para su procesamiento
, llame al método start() del objeto de hilo para comenzar la amenaza

2) Implementar subprocesos múltiples (método de clase interna anónimo)

Cree un objeto de clase interna anónimo de Runnable y
entrégueselo a Thread para que lo procese
. Llame a start() del objeto de hilo para iniciar el hilo.

3) Ventajas y desventajas

  • ventaja

Implementa la interfaz de Runnale y puede continuar heredando e implementando

  • defecto

El hilo tiene un resultado de ejecución y no puede regresar directamente

3. Implementar interfaces Callable y FutureTask (método 3)

1) Implementar subprocesos múltiples

Cree la clase de implementación de la interfaz Callable, reescriba el método call() y encapsule
el objeto Callable en un objeto de tarea de subproceso con FutureTask. El
objeto de tarea de subproceso se entrega a Thread para su procesamiento, y se llama al método start() para iniciar el hilo
Después de completar la ejecución de la tarea, el método get para obtener el resultado de la ejecución de la tarea

2) Ventajas y desventajas

  • ventaja

La clase de tarea de subproceso solo implementa la interfaz y puede continuar heredando la clase e implementando la interfaz, que es altamente extensible.
Puede obtener el resultado de la ejecución del subproceso después de ejecutar el subproceso.

  • defecto

La codificación es complicada

nombre del método explique
public FutureTask<>(Callable call) Encapsule el objeto Callable en un objeto FutureTask
public V get() throws Exception Obtenga el resultado devuelto por el hilo que ejecuta el método de llamada

4. Hilo de rosca

1) Constructor de hilo

Constructor explique
public Thread(String name) Especificar un nombre para el hilo actual
public Thread(Runnable target) Encapsular un objeto ejecutable en un objeto de subproceso
public Thread(Runnable target ,String name ) Encapsule el objeto Runnable en un objeto de subproceso y especifique el nombre del subproceso

inserte la descripción de la imagen aquí

public class MyRunnable implements Runnable{
    
    
    @Override
    public void run() {
    
    
        for (int i = 0; i < 10; i++) {
    
    
            System.out.println("Runnable "+Thread.currentThread().getName()+" ===>> "+i);
        }
    }
}

public class ClassStructure {
    
    
    public static void main(String[] args){
    
    
        MyRunnable myRunnable = new MyRunnable();
        //分配一个带有指定目标新的线程对象
        Thread thread = new Thread(myRunnable);
        //获取当前线程名称
        String name = thread.getName();
        System.out.println("当前名称-1:"+name);
        //设置新的名称
        thread.setName("Thread-1-新");
        String newName = thread.getName();
        System.out.println("当前名称-1:"+ newName);
        //启动多线程
        thread.start();

        MyRunnable mr = new MyRunnable();
        //分配一个带有指定目标新的线程对象并指定名称
        Thread td = new Thread(mr,"指定名称:");
        String strName = td.getName();
        System.out.println("当前名称-2:"+ strName);
        td.start();
    }
}

5. Método de hilo

1) El subproceso obtiene y establece el nombre del subproceso

nombre del método explique
String getName​() Obtenga el nombre del hilo actual, el nombre predeterminado del hilo es Thread-index
void setName​(String name) Cambie el nombre de este subproceso al nombre especificado, el nombre del subproceso también se puede establecer a través del constructor

inserte la descripción de la imagen aquí

public class ClassStructure {
    
    
    public static void main(String[] args){
    
    
        Thread thread = new Thread();
        String name = thread.getName();
        System.out.println(name);

        thread.setName("线程1");
        String nameNew = thread.getName();
        System.out.println(nameNew);
    }
}


2) La clase Thread obtiene el objeto del hilo actual

nombre del método explique
public static Thread currentThread() Devuelve una referencia al objeto de subproceso que se está ejecutando actualmente.

Aviso:

1. Este método es un método estático de la clase Thread y se puede llamar directamente usando la clase Thread.
2. Qué objeto de subproceso se obtiene cuando se llama a este método en qué ejecución de subproceso.

public class MyThread extends Thread {
    
    
    public MyThread(String name) {
    
    
        super(name);
    }

    @Override
    public void run() {
    
    
        super.run();
        for (int i = 0; i < 10; i++) {
    
    
            //获得当前正在执行的线程对象
            Thread td = Thread.currentThread();
            //获取当前线程名称
            System.out.println(td.getName() + i);
        }
    }
}

3) El método de suspensión de hilos de la clase Thread:

nombre del método explique
public static void sleep(long time) Deje que el subproceso actual entre en reposo durante el tiempo especificado antes de continuar con la ejecución, en milisegundos

inserte la descripción de la imagen aquí

public class MyThread extends Thread {
    
    
    public MyThread(String name) {
    
    
        super(name);
    }

    @Override
    public void run() {
    
    
        super.run();
        for (int i = 0; i < 10; i++) {
    
    
            //获得当前正在执行的线程对象
            Thread td = Thread.currentThread();
            //获取当前线程名称
            System.out.println(td.getName() + i);

        }
    }
}

public class ClassStructure {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    
        MyRunnable mr = new MyRunnable();
        //分配一个带有指定目标新的线程对象并指定名称
        Thread td = new Thread(mr,"指定名称:");
        String strName = td.getName();
        System.out.println("当前名称-2:"+ strName);
        System.out.println(System.currentTimeMillis());
        //暂停3秒
        Thread.sleep(3000);
        System.out.println(System.currentTimeMillis());
        td.start();
    }
}


2. Seguridad de hilos

Múltiples subprocesos acceden al mismo recurso compartido al mismo tiempo y modifican el recurso

3. Sincronización de subprocesos

  • concepto

Solucionar problemas de seguridad de subprocesos

  • Seguridad de hilo garantizada

Múltiples subprocesos pueden acceder a recursos compartidos uno tras otro, lo que puede resolver problemas de seguridad

  • Pensamiento

Bloqueo: permitir que múltiples subprocesos accedan a recursos compartidos uno tras otro puede resolver problemas de seguridad

1. Bloque de código sincronizado

  • principio

Solo un subproceso puede ingresar a la vez. Una vez que se completa la ejecución, se desbloquea automáticamente y otros subprocesos pueden ingresar y ejecutarse.

  • efecto

El código central de los problemas de seguridad de subprocesos está bloqueado

  • lograr la seguridad del hilo

El código central en cuestión es usar sincronizado para bloquear,
y solo un subproceso puede ocupar el bloqueo y entrar en ejecución a la vez.

  • Formato
synchronized(同步锁对象) {
    
    
	操作共享资源的代码(核心代码)
}
  • Requisitos del objeto de bloqueo de sincronización

Para los métodos de instancia, se recomienda utilizarlo como objeto de bloqueo.
Para los métodos estáticos, se recomienda utilizar el objeto bytecode (nombre de clase.clase) como objeto de bloqueo.

2. Método de sincronización

  • principio

Solo un subproceso puede ingresar a la vez. Una vez que se completa la ejecución, se desbloquea automáticamente y otros subprocesos pueden ingresar y ejecutarse.

  • efecto

El código central de los problemas de seguridad de subprocesos está bloqueado

  • Formato
  • lograr la seguridad del hilo

El código central en cuestión es usar sincronizado para bloquear,
y solo un subproceso puede ocupar el bloqueo y entrar en ejecución a la vez.

修饰符 synchronized 返回值类型 方法名称(形参列表) {
    
    
	操作共享资源的代码
}
  • Requisitos del objeto de bloqueo de sincronización

Para los métodos de instancia, se recomienda utilizarlo como objeto de bloqueo.
Para los métodos estáticos, se recomienda utilizar el objeto bytecode (nombre de clase.clase) como objeto de bloqueo.

  • principio subyacente

Si el método es un método de instancia: el método sincronizado lo usa como objeto de bloqueo de forma predeterminada. Pero el código debe estar muy orientado a
objetos.Si el método es un método estático: el método de sincronización utiliza el nombre de clase .class como objeto de bloqueo de forma predeterminada.

3. Bloquear

  • principio

El objeto de bloqueo Lock es más flexible y cómodo de usar.
La implementación de bloqueo proporciona una gama más amplia de operaciones de bloqueo que el uso de métodos y declaraciones sincronizados. El
bloqueo es una interfaz que no se puede instanciar directamente. Aquí, su clase de implementación ReentrantLock se usa para construir un bloqueo objeto de bloqueo

nombre del método explique
public ReentrantLock​() Obtenga el objeto de clase de implementación del bloqueo de bloqueo
void lock() cerrar
void unlock() desbloquear

Supongo que te gusta

Origin blog.csdn.net/walykyy/article/details/126708333
Recomendado
Clasificación