BlockingQueue阻塞队列

BlockingQueue阻塞队列

 

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同步队列

 

特点

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

  • 同步队列没有存储空间

  • 存储元素操作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  阅读(129)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示