1. 程式人生 > >java併發佇列之ArrayBlockingQueue、LinkedBlockingQueue

java併發佇列之ArrayBlockingQueue、LinkedBlockingQueue

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 "網站已得