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


 
                
             浙公网安备 33010602011771号
浙公网安备 33010602011771号