Java 同步队列 SynchronousQueue

参考

介绍

我理解为队列长度为1,放进去一个元素之后就必须等待别人取出之后才能放入下一个

blocking queue ,其中每个插入操作必须等待另一个线程执行相应的删除操作,反之亦然。 同步队列没有任何内部容量,甚至没有容量。 您不能在同步队列中使用peek ,因为只有在您尝试删除它时才会出现该元素; 你不能插入一个元素(使用任何方法),除非另一个线程试图删除它; 你不能迭代,因为没有什么可以迭代。 队列的头部是第一个排队插入线程试图添加到队列的元素; 如果没有这样排队的线程,那么没有元素可供删除, poll()将返回null 。 出于其他Collection方法的目的(例如contains ), SynchronousQueue充当空集合。 此队列不允许null元素。

代码

package queue;

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

/**
 * @Author 夏秋初
 * @Date 2022/3/3 13:53
 */
public class Test {
    public static void main(String[] args) {
        SynchronousQueue<String> synchronousQueue = new SynchronousQueue();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    synchronousQueue.put(String.valueOf(i));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                try {
                    System.out.println(synchronousQueue.take());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

posted @ 2022-03-03 14:18  夏秋初  阅读(373)  评论(0编辑  收藏  举报