最近在複習多線程的知識,必然少不了要掃描一遍JUC包下的各個類或接口,今天就先來聊一聊阻塞隊列BlockingQueue;
BlockingQueue是jdk1.5發佈的JUC包下的一個工具類,他提供了天生阻塞的拿(put)和取(take)元素的方法,線程安全,通過其阻塞的put、take方法能很好的實現生產者消費者模型,解決線程間的通信問題,
下面先分別介紹其本身擁有的一些特性方法和實現類
特性方法:
boolean add(E e); 添加元素,成功返回true,失敗返回false,如果隊列設置了長度,超長會拋java.lang.IllegalStateException: Queue full異常
void put(E e); 阻塞式的添加元素,如果隊列超長當前線程會一直阻塞,直到隊列裏的元素被take可以成功添加爲止
boolean offer(E e); 添加元素,成功返回true,失敗返回false,與add的區別在於隊列滿了添加失敗不會拋異常而是返回false
E take(); 阻塞式的獲取隊列元素,只要take不到元素當前線程會一直阻塞,直到隊列裏有元素併成功獲取
E poll(); 從隊列頭部獲取並移除元素,獲取不到返回null
E peek(); 從隊列頭部獲取元素但不移除元素,獲取不到返回null
int drainTo(Collection<? super E> c); 將隊列中的元素全部移除,併發送到給定的集合中,返回的是操作成功的元素個數
關於實現類我也不想利用文本的方式一個個列起來了,下面直接附上我整理的思維導圖的部分截圖,簡單明瞭:
需要注意的是,BlockingQueue的一衆實現類是線程池接收任務隊列的多種實現,不同的隊列應用於不同場景下的線程池;後面會抽時間寫一篇關於線程池的總結筆記