JUC- 阻塞队列&同步队列的使用

835 阅读1分钟

BlockingQueue

$}}A668AQZ3}Z2B4AGU``OV.png

BlockingQueue要求当队列为空或满时就会阻塞线程

方式有返回值,抛出异常有返回值,不抛出异常没有返回值,阻塞等待有返回值,超时等待
添加add()offer()put()offer(..)
移除remove()poll()take()poll(..)
检测队首元素element()peek()--
public static void main(String[] args) {
        // 3代表队列的容量
        BlockingQueue<String> objects = new ArrayBlockingQueue<>(3);
        objects.add("a");
        objects.add("c");
        objects.add("b");
        //objects.add("d"); 报错Queue full
        //System.out.println(objects.offer("d"));输出false
        // objects.put("d"); 阻塞等待
        //objects.offer("d",2, TimeUnit.SECONDS);等待两秒,超时放弃.2代表时间,TimeUtil.Seconds代表时间单位
        System.out.println(objects.remove());
        System.out.println(objects.remove());
        System.out.println(objects.remove());
        //System.out.println(objects.remove());//报错NoSuchElementException
        //System.out.println(objects.poll()); 输出null
        //objects.take();阻塞等待
        //objects.poll(2,TimeUnit.SECONDS);等待两秒,超时放弃
       

    }

SynchronousQueue 同步队列

没有容量,放完必须取。


public class BlockingQueueTest {
    public static void main(String[] args) {
        BlockingQueue<String > objects = new SynchronousQueue<>();

        new Thread(()->{

            try {
                System.out.println(Thread.currentThread().getName()+"put");
                objects.put(String.valueOf(1));
                System.out.println(Thread.currentThread().getName()+"put");
                objects.put(String.valueOf(2));
                System.out.println(Thread.currentThread().getName()+"put");
                objects.put(String.valueOf(2));

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }).start();
        new Thread(()->{
            try {
                Thread.sleep(2);
                System.out.println(Thread.currentThread().getName()+"get"+objects.take());
                Thread.sleep(2);
                System.out.println(Thread.currentThread().getName()+"get"+objects.take());
                Thread.sleep(2);
                System.out.println(Thread.currentThread().getName()+"get"+objects.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

    }

}
Thread-0put
Thread-1get1
Thread-0put
Thread-1get2
Thread-0put
Thread-1get2