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