百木园-与人分享,
就是让自己快乐。

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();
  }
}

 


来源:https://www.cnblogs.com/wfy-studying/p/16161862.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » BlockingQueue阻塞队列

相关推荐

  • 暂无文章