BlockingQueue和SynchronousQueue

BlockingQueue四组api

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

public class BlockQueueTest {

    public static void main(String[] args) {
//      test1();
//      test2();
//      test3();
        test4();
    }

    // 抛出异常
    public static void test1() {
        ArrayBlockingQueue abq = new ArrayBlockingQueue<>(3);
        abq.add("a");
        abq.add("b");
        abq.add("c");
//      abq.add("d"); //超出队列容量,java.lang.IllegalStateException: Queue full
        
        System.out.println("队首元素"+abq.element()); // element返回队首元素
        
        System.out.println(abq.remove());
        System.out.println(abq.remove());
        System.out.println(abq.remove());
//      System.out.println(abq.remove());//队列没有元素,抛出java.util.NoSuchElementException
    }
    
    // 有返回值,不抛出异常
    public static void test2() {
        ArrayBlockingQueue abq = new ArrayBlockingQueue<>(3);
        abq.offer("a");
        abq.offer("b");
        System.out.println(abq.offer("c")); // true
        System.out.println(abq.offer("d"));; //超出队列容量,不会抛出异常, 返回false
        
        System.out.println("队首元素"+abq.peek()); // element返回队首元素
        System.out.println(abq.poll());
        System.out.println(abq.poll());
        System.out.println(abq.poll());
        System.out.println(abq.poll());// 队列没有元素,返回null
    }
    
    // 等待,一直阻塞
    public static void test3() {
        ArrayBlockingQueue abq = new ArrayBlockingQueue<>(3);
        try {
            abq.put("b");
            abq.put("c");
            abq.put("d");
//          abq.put("a"); 超出容量后,一直阻塞等待
            
            System.out.println(abq.take());
            System.out.println(abq.take());
            System.out.println(abq.take());
            System.out.println(abq.take());// 队列没有元素,take一直阻塞等待
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    // 等待,超时阻塞
    public static void test4() {
        
        try {
            ArrayBlockingQueue abq = new ArrayBlockingQueue<>(3);
            abq.offer("a");
            abq.offer("b");
            System.out.println(abq.offer("c"));
            System.out.println(abq.offer("d", 2, TimeUnit.SECONDS));
            
            System.out.println(abq.poll());
            System.out.println(abq.poll());
            System.out.println(abq.poll());
            System.out.println(abq.poll(2, TimeUnit.SECONDS));// 队列没有元素,超时返回null
        } catch (InterruptedException e) {
            e.printStackTrace();
        };
    }
}

SynchronousQueue

BlockingQueue<String>syQueue = new SynchronousQueue<>();
new Thread(()->{
    try {
        System.out.println("put first");
        syQueue.put("first");
        System.out.println("put second");
        syQueue.put("second");
        System.out.println("put thrid");
        syQueue.put("thrid");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}, "syQueue put").start();

new Thread(()->{
    try {
        System.out.println("get:"+syQueue.take());
        TimeUnit.SECONDS.sleep(3);
        System.out.println("get:"+syQueue.take());
        TimeUnit.SECONDS.sleep(3);
        System.out.println("get:"+syQueue.take());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}, "syQueue take").start();
2.gif
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容