juc之阻塞队列

什么是阻塞队列?

当队列为空时,从队列中获取元素将阻塞。

当队列为满时,从队列中添加元素将阻塞。

 

为什么需要阻塞队列,有什么好处?

在多线程领域:所谓阻塞,在某些条件下会挂起线程(即阻塞),一旦条件满足,挂起的线程又会自动被唤醒。

好处是我们不需要关系什么时候阻塞队列,什么时候唤醒队列,这一切BlockingQueue已经包装好了,concurrent包发布以前需要自己手动去控制这些细节。

 

juc之阻塞队列_第1张图片

juc之阻塞队列_第2张图片

 

 add方法,当添加元素满时再添加会报错。

juc之阻塞队列_第3张图片

remove方法,当队列空时,再移除会报错。 

juc之阻塞队列_第4张图片 element方法,用来检验当前元素,如果为空会报错,不为空会取出当前元素,队列不会移除还会存在。

juc之阻塞队列_第5张图片

使用offer方法,如果插入不进去了等待两秒返回false。

juc之阻塞队列_第6张图片

同步队列,只能存储一个。 

juc之阻塞队列_第7张图片

package com.example.demo;

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

public class ArrayBlockingQueueDemo {

    public static void main(String[] args) throws InterruptedException {
        BlockingQueue queue = new SynchronousQueue<>();

        new Thread(()->{
            try {
                queue.put("1");
                System.out.println(Thread.currentThread().getName()+":put 1");
                queue.put("2");
                System.out.println(Thread.currentThread().getName()+":put 2");
                queue.put("3");
                System.out.println(Thread.currentThread().getName()+":put 3");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"AA").start();
        new Thread(()->{
            try {
                queue.take();
                System.out.println(Thread.currentThread().getName()+":take 1");
                queue.take();
                System.out.println(Thread.currentThread().getName()+":take 2");
                queue.take();
                System.out.println(Thread.currentThread().getName()+":take 3");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"BB").start();

    }
}

 

你可能感兴趣的:(juc)