ArrayBlockingQueue和LinkedBlockingQueue用法上沒有什麼區別,因此就放在一塊兒把。html
特色:阻塞隊列,ArrayBlockingQueue定義時須要給定長度(有界隊列),LinkedBlockingQueue定義時可給可不給(無界隊列)。put函數在超出隊列長度就會阻塞,take函數在隊列中無數據會阻塞。offer函數和poll函數不會發生阻塞,有返回參數。add函數在超出隊列長度時會報錯,remove函數能夠移除指定數據。java
區別:ArrayBlockingQueue在添加和取出共用一把鎖,而LinkedBlockingQueue是分開的兩把鎖。另外一個區別看就是一個底層實現是數組一個是單向鏈表,數組和鏈表的區別就是數組適合讀取,插入和刪除都會影響數組中其他元素,鏈表正好相反,適合插入刪除只會影響關聯的的一個元素,不適合讀取,讀取會重頭開始讀取。web
應用場景:用到隊列的場景基本都是這個。spring
代碼案例:數組
package com.example.web.web; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.TimeUnit; @RestController public class HomeController { @RequestMapping("/index") public String index() throws Exception { ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(2); //生產者 new Thread(() -> { try { TimeUnit.MILLISECONDS.sleep(5000); System.out.println("生產者begin"); queue.put("測試數據"); //queue.offer("測試數據", 5, TimeUnit.SECONDS); System.out.println("生產者end"); } catch (Exception ex) { } }).start(); //消費者 new Thread(() -> { try { System.out.println("消費者begin"); //String aa = queue.take(); String aa = queue.poll(2, TimeUnit.SECONDS); System.out.println("消費者end" + aa); } catch (Exception ex) { } }).start(); //主線程也等待下 TimeUnit.SECONDS.sleep(10); return "網站已獲得響應"; } }
參考連接:app
http://ifeve.com/java-blocking-queue/函數
https://www.cnblogs.com/liqiu/p/3630281.html測試
http://www.importnew.com/24055.html網站