Cola síncrona de JUC

Diagrama de estructura

Inserte la descripción de la imagen aquí

Introducción a SynchronousQueue

  • El tamaño es solo 1;
  • Pertenece a una cola sincrónica;
  • Debe esperar a que se elimine el elemento agregado antes de continuar agregando, de lo contrario, ha estado esperando.

Caso de prueba SynchronousQueue

Para verificar las características descritas anteriormente, escriba el siguiente código para observar los resultados:

1. Continúe agregando 3 mensajes de datos a SynchronousQueue.
2. La operación de lectura adopta un método de lectura retardada.
3. Observe la información del registro.

package demo5_4;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;

/**
 * 同步队列;
 * 大小只有1;
 * 必须等待存放的数据消费掉后,才会继续向队列中增加数据,否则一直等待!
 */
public class SynchronousQueueDemo {
    
    
    public static void main(String[] args) {
    
    
        SynchronousQueue synchronousQueue = new SynchronousQueue();
        // 存数据
        new Thread(()->{
    
    
            try {
    
    
                System.out.println(Thread.currentThread().getName() + "put 1 "+System.currentTimeMillis());
                synchronousQueue.put("1");
                System.out.println(Thread.currentThread().getName() + "put 2 "+System.currentTimeMillis());
                synchronousQueue.put("2");
                System.out.println(Thread.currentThread().getName() + "put 3 "+System.currentTimeMillis());
                synchronousQueue.put("3");

            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        },"A").start();

        // 获取数据
        new Thread(()->{
    
    
            try {
    
    
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+" 获取 "+synchronousQueue.take()+" 成功 "+System.currentTimeMillis());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+" 获取 "+synchronousQueue.take()+" 成功 "+System.currentTimeMillis());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+" 获取 "+synchronousQueue.take()+" 成功 "+System.currentTimeMillis());
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        },"B").start();
    }
}

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_38322527/article/details/115079824
Recomendado
Clasificación