java併發隊列之ArrayBlockingQueue、LinkedBlockingQueue

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網站

相關文章
相關標籤/搜索