java併發佇列之ArrayBlockingQueue、LinkedBlockingQueue
阿新 • • 發佈:2019-06-01
ArrayBlockingQueue和LinkedBlockingQueue用法上沒有什麼區別,所以就放在一起把。
特點:阻塞佇列,ArrayBlockingQueue定義時需要給定長度,LinkedBlockingQueue定義時可給可不給。put函式在超出佇列長度就會阻塞,take函式在佇列中無資料會阻塞。offer函式和poll函式不會發生阻塞,有返回引數。add函式在超出佇列長度時會報錯,remove函式可以移除指定資料。
區別:ArrayBlockingQueue在新增和取出共用一把鎖,而LinkedBlockingQueue是分開的兩把鎖。
應用場景:用到佇列的場景基本都是這個。
程式碼案例:
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 "網站已得