Entrevista Blitz 49: ¿Hablar sobre el cambio de Exchange en JUC?

Exchange (Exchange), como su nombre indica, se utiliza para realizar el intercambio de datos entre dos subprocesos. Nació en JDK 1.5. Tiene dos métodos principales:

  • intercambio (V x): espere a que otro hilo llegue a este punto de intercambio, luego transfiera el objeto al otro hilo y obtenga el objeto intercambiado del otro hilo. Si otro subproceso no alcanza este punto de intercambio, el subproceso se suspenderá para siempre (a menos que el subproceso lo interrumpa).
  • intercambio (V x, tiempo de espera largo, unidad de unidad de tiempo): espere a que otro subproceso llegue a este punto de intercambio, luego transfiera el objeto al otro subproceso y obtenga el objeto intercambiado del otro subproceso. Si otro subproceso no alcanza este punto de intercambio, el subproceso se suspenderá hasta que encuentre una interrupción de subproceso, o espere más tiempo que el establecido, luego arroja una excepción.

Es decir, el método de intercambio es un punto de intercambio, y el hilo esperará en este punto de intercambio hasta que otro hilo también llame al método de intercambio (equivalente a ingresar a este punto de intercambio), luego intercambiarán datos y luego ejecutarán el siguiente código.

Uso básico

El uso básico de Exchange es el siguiente. Creamos dos subprocesos para simular el escenario de "pago en una mano y entrega en una mano". El subproceso 1 primero prepara el dinero para ingresar al punto de intercambio y luego espera a que el subproceso 2 se prepare. los bienes (cosas) después de 2s, y luego intercambiar datos entre sí y ejecutar el proceso posterior.El código de implementación específico es el siguiente:

import java.time.LocalDateTime;
import java.util.concurrent.Exchanger;

public class ExchangeExample {
    // 创建一个交互器
    private final static Exchanger<String> exchange = new Exchanger<>();
    public static void main(String[] args) {
        // 线程 1【准备钱】
        new Thread(() -> {
            System.out.println("线程1:准备筹钱中...| Time:" + LocalDateTime.now());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String moeny = "1000 万";
            System.out.println("线程1:钱准备好了【1000 万】。| Time:" + 
                               LocalDateTime.now());
            try {
                // 执行数据交换【交易】
                String result = exchange.exchange(moeny);
                System.out.println("线程1:交易完成,得到【" + result +
                        "】 | Time:" + LocalDateTime.now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        // 线程 2【准备货】
        new Thread(() -> {
            System.out.println("线程2:准备物品中【西伯利亚新鲜空气】...| Time:" + 
                               LocalDateTime.now());
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String goods = "西伯利亚新鲜空气";
            System.out.println("线程2:物品准备好了【西伯利亚新鲜空气】。| Time:" + 
                               LocalDateTime.now());
            try {
                // 执行数据交换【交易】
                String result = exchange.exchange(goods);
                System.out.println("线程2:交易完成,得到【" + result +
                        "】 | Time:" + LocalDateTime.now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}
复制代码

El resultado de la ejecución del programa anterior es el siguiente:imagen.png

Resumir

Exchanger se utiliza para realizar el intercambio de datos entre dos subprocesos. Exchanger puede intercambiar datos de cualquier tipo, siempre que el tipo genérico se defina cuando se crea. Su método principal es el intercambio. Cuando el subproceso ejecuta este método, se dormirá y esperará a que otro subproceso también ingrese al punto de intercambio. Si otro subproceso también ingresa al punto de intercambio (y también ejecuta el método de intercambio), los dos intercambiarán datos. en este momento. , y ejecutar procesos posteriores.

Depende de uno mismo juzgar lo que está bien y lo que está mal, escuchar a los demás y contar las ganancias y las pérdidas.

Cuenta oficial: análisis de las preguntas de la entrevista de Java

Colección de entrevistas: gitee.com/mydb/interv…

Supongo que te gusta

Origin juejin.im/post/7098968690661523492
Recomendado
Clasificación