BlockingQueue阻塞队列

BlockingQueue阻塞队列

image-20220418092217307

BlockingQueue的四组API

/**BlockQueue的四组API
 * 1.抛出异常
 * 2.有返回值,不抛出异常
 * 3.阻塞等待
 * 4.超时等待
 */
public class BlockQueueTest {
    public static void main(String[] args) throws InterruptedException {
        test03();
    }

    /**抛出异常
     * */
    public static void test01(){
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);//队列的长度
        System.out.println(blockingQueue.add("a"));
        System.out.println(blockingQueue.add("b"));
        System.out.println(blockingQueue.add("c"));
        //获取队首元素
        System.out.println(blockingQueue.element());
        //IllegalStateException: Queue full 抛出异常,列满
                  //blockingQueue.add("d");
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());
        //.NoSuchElementException 队空
        //System.out.println(blockingQueue.remove());

    }
    /**不抛出异常,有返回值
     * */
    public static void test02(){
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
        System.out.println(blockingQueue.offer("a"));
        System.out.println(blockingQueue.offer("b"));
        System.out.println(blockingQueue.offer("c"));
        //获取队首元素
        System.out.println(blockingQueue.peek());
        //有返回值,不抛出异常
       // System.out.println(blockingQueue.offer("d"));
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.poll());
        //有返回值,不抛出异常
        //System.out.println(blockingQueue.poll());
    }
    /**阻塞等待,一直阻塞
     * */
    public static void test03() throws InterruptedException {
        ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);
        arrayBlockingQueue.put("a");
        arrayBlockingQueue.put("b");
        arrayBlockingQueue.put("c");
        //队满,阻塞等待,一直等待
        //arrayBlockingQueue.put("d");
        System.out.println(arrayBlockingQueue.take());
        System.out.println(arrayBlockingQueue.take());
        System.out.println(arrayBlockingQueue.take());
        //队空,阻塞等待,一直等待
        //System.out.println(arrayBlockingQueue.take());
    }
    /**
     *超时等待,但不会一直等待,阻塞时间内等待,之后退出
     */
    public static void test04() throws InterruptedException {
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
        System.out.println(blockingQueue.offer("a", 2, TimeUnit.SECONDS));
        System.out.println(blockingQueue.offer("b", 2, TimeUnit.SECONDS));
        System.out.println(blockingQueue.offer("c", 2, TimeUnit.SECONDS));
        //阻塞两秒,队满返回false退出
        // System.out.println(blockingQueue.offer("c", 2, TimeUnit.SECONDS));

        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
        //阻塞异常,阻塞两秒,队空返回null
        // System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
    }
}

SynchronousQueue同步队列

image-20220418200119375

特点

  • 插入操作必须等待队列中的上一个元素被取出后才能插入,反之亦然。

  • 同步队列没有存储空间

  • 存储元素操作put() ,读取操作take( )

//同步队列
public class SynchronousQueueTest {
    public static void main(String[] args) {
        //SynchronousQueue是BlockingQueue的子类
        BlockingQueue<String> synchronousQueue = new SynchronousQueue<>();
        new Thread(()->{
            try {
                System.out.println(Thread.currentThread().getName()+" put1");
                synchronousQueue.put("a");
                System.out.println(Thread.currentThread().getName()+" put2");
                synchronousQueue.put("b");
                System.out.println(Thread.currentThread().getName()+" put3");
                synchronousQueue.put("c");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"A").start();
        new Thread(()->{
            try {
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"----"+synchronousQueue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"----"+synchronousQueue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"----"+synchronousQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"B").start();
    }
}
posted @   ShamUnite  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示