同步队列SynchronousQueue

HeJin小于 1 分钟JavaJUC并发编程

同步队列SynchronousQueue

image-20210312133320322
image-20210312133320322

没有容量,进去一个元素,必须等待取出来之后,才能再放一个元素。SynchronousQueue不存储元素,put了一个元素,必须从里面先take处理,否则不能在put进去值。

/**
 * @Desc 同步队列
 * @Author HeJin
 * @Date 2021/3/12 13:33
 */
public class SynchronousQueueDemo {
    public static void main(String[] args) {
        BlockingQueue<String> blockingQueue = new SynchronousQueue<>();

        new Thread(() -> {
            try {
                System.out.println(Thread.currentThread().getName()+" put 1");
                blockingQueue.put("1");
                System.out.println(Thread.currentThread().getName()+" put 2");
                blockingQueue.put("2");
                System.out.println(Thread.currentThread().getName()+" put 3");
                blockingQueue.put("3");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"t1").start();

        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName() + " take " + blockingQueue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName() + " take "  + blockingQueue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName() + " take "  + blockingQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"t2").start();
    }
}

结果:

t1 put 1
t2 take 1
t1 put 2
t2 take 2
t1 put 3
t2 take 3

Process finished with exit code 0