LinkedBlockingQueue的3对易混API

目录

3对API结论

放入测试

取出测试

 

3对API结论

Level. 放入   取出  
1 add 队列满?异常:return true remove 队列空?异常:return head
2 offer 队列满?return false:return true poll 队列空?return null:return head
3 put 队列满?阻塞:return [void] take 队列空?阻塞:return head

放入测试

public static void main(String[] args) throws Exception {
       new Thread(() -> {
            BlockingQueue<String> queue = new LinkedBlockingQueue<>(1);
            try {
                queue.put("1");
                queue.put("1"); //满时阻塞
                System.out.println("不打印我");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(() -> {
            BlockingQueue<String> queue = new LinkedBlockingQueue<>(1);
            System.out.println("offer1"+queue.offer("1"));
            System.out.println("offer2"+queue.offer("1"));//满时返回false
        }).start();

        new Thread(() -> {
            BlockingQueue<String> queue = new LinkedBlockingQueue<>(1);
            System.out.println("add1"+queue.add("1"));
            System.out.println("add2"+queue.add("1"));//满时异常
        }).start();


       
    }

offer1true
offer2false
add1true
Exception in thread "Thread-2" java.lang.IllegalStateException: Queue full
    at java.util.AbstractQueue.add(AbstractQueue.java:98)
    at com.construn.vehicle.common.core.monitor.App.lambda$main$2(App.java:30)
    at com.construn.vehicle.common.core.monitor.App$$Lambda$3/1982791261.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)

 


public static void main(String[] args) throws Exception {

         new Thread(() -> {
            BlockingQueue<String> queue = new LinkedBlockingQueue<>(Lists.newArrayList("AAA"));
            try {
                System.out.println("take1"+queue.take());
                System.out.println("take2"+queue.take()); //空时阻塞
                System.out.println("不打印我");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(() -> {
            BlockingQueue<String> queue = new LinkedBlockingQueue<>(Lists.newArrayList("AAA"));
            System.out.println("poll1"+queue.poll());
            System.out.println("poll2"+queue.poll());//空时返回null
        }).start();

        new Thread(() -> {
            BlockingQueue<String> queue = new LinkedBlockingQueue<>(Lists.newArrayList("AAA"));
            System.out.println("remove1"+queue.remove());
            System.out.println("remove2"+queue.remove());//空时异常
        }).start();




    }

remove1AAA
poll1AAA
poll2null
take1AAA
Exception in thread "Thread-2" java.util.NoSuchElementException
    at java.util.AbstractQueue.remove(AbstractQueue.java:117)
    at com.construn.vehicle.common.core.monitor.App.lambda$main$2(App.java:54)
    at com.construn.vehicle.common.core.monitor.App$$Lambda$3/1982791261.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)

上一篇:线程池的三种队列区别:SynchronousQueue、LinkedBlockingQueue 和ArrayBlockingQueue


下一篇:【Java】阻塞队列ArrayBlockingQueue与LinkedBlockingQueue区别