參考:https://www.cnblogs.com/KingIceMou/p/8075343.htmlhtml
BlockingQueue是一個阻塞隊列接口,BlockingQueue基於隊列容器實現了插入和取出數據的阻塞,若是隊列中沒有數據時,取出數據的操做被阻塞直到隊列中有數據能被取出;若是隊列中數據已經填滿,則插入數據的操做將被阻塞,直到隊列中有空位可以插入。BlockingQueue實現是線程安全的,全部排隊方法都使用內部鎖或其餘形式的併發控制以原子方式實現其效果,除非在實現中另有說明。基於以上特性咱們能夠很輕鬆的實現生產者-消費者模型。java
BlockingQueue主要有如下方法:數組
//向隊列中添加一個元素,成功返回true;該元素不能爲null,若是隊列已滿則拋出IllegalStateException boolean add(E e); //向隊列中添加一個元素,成功返回true;該元素不能爲null,若是隊列已滿則返回false boolean offer(E e); //向隊列中添加一個元素,成功返回true;該元素不能爲null,若是隊列已滿則調用此方法的線程被阻塞等待timeout時間,若是超過了timeout還不能入隊則返回false,若是等待過程被中斷則拋出InterruptedException boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException; //向隊列中添加一個元素,成功返回true;該元素不能爲null,若是隊列已滿則調用此方法的線程被阻塞等待,直到隊列中裏面有空間再入隊,若是等待過程被中斷則拋出InterruptedException void put(E e) throws InterruptedException; //取出隊列中的頭部元素,若是隊列爲空則調用此方法的線程被阻塞等待,直到有元素能被取出,若是等待過程被中斷則拋出InterruptedException E take() throws InterruptedException; //取出隊列中的頭部元素,若是隊列爲空返回null E poll(); //取出隊列中的頭部元素,若是隊列爲空則調用此方法的線程被阻塞等待timeout時間,若是超過了timeout尚未元素能被取出則返回null,若是等待過程被中斷則拋出InterruptedException E poll(long timeout, TimeUnit unit) throws InterruptedException; //返回隊列中的頭部元素,但不從隊列中移除該元素,若是隊裏爲空則返回null E peek(); //返回隊列的剩餘容量,咱們不該該用該方法來判斷咱們能不能插入成功,由於可能另外一個線程已經插入了 int remainingCapacity(); //從隊列中刪除指定元素,若是該元素存在則刪除該元素並返回true,不然返回false;注意若是隊裏中存在多個相同元素,該方法只會刪除離頭最近的那一個 boolean remove(Object o); //判斷隊列中是否存當前元素 boolean contains(Object o); //將隊列中全部元素取出來放到集合c中 drainTo(Collection<? super E> c)
BlockingQueue的主要實現有:ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue這幾種,他們之間須要注意的幾點是:安全