Java-Queue-ArrayBlockingQueue

Scroll Down
  • LinkedBlockingQueue

    可以不初始化容量,如果没有指定容量,那么默认容量为Integer.MAX_VALUE(此时需要注意当消费者崩溃或者消费不及时,如果生产者队列一直生产数据到队列,那么有可能会耗光资源,因为队列容量是MAX_VALUE);
  • ArrayBlockingQueue

    必须初始化队列容量,当队列满或者队列空的时候,队列外被block的put线程或者take线程,可以选择是否采取公平锁的等候机制,即当队列有空间或者队列有值的时候,先到的线程优先处理,默认情况下不采用公平锁机制,即选择随机处理;
  • PriorityBlockingQueue

    可以对队列的元素进行排序,通过指定comparator

ArrayBlockingQueue

  • 当队列里面没有值,如果执行take操作,队列会一直blocking,直到有值进去队列,然后从对立里面拿走值
  • 当队列满的时候,如果执行put操作,队列会一直blocking,直到有值被拿出队列有空间,然后将该值放入队尾。
package com.troy.concurrent.queue;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;

/**
 * ArrayBlockingQueue
 * 当队列里面没有值,如果执行take操作,队列会一直blocking,直到有值进去队列,然后从对立里面拿走值
 * 当队列满的时候,如果执行put操作,队列会一直blocking,直到有值被拿出队列有空间,然后将该值放入队尾
 */
public class QueueRunner_ArrayBlockingQueue {
    List list = new ArrayList();
    //里面有基于lock的condition实现
    ArrayBlockingQueue queue = new ArrayBlockingQueue(1);
    public static void main(String[] args) throws Exception {
        QueueRunner_ArrayBlockingQueue runner = new QueueRunner_ArrayBlockingQueue();
        //代码段展示了ArrayBlockQueue的示例
        try {
            Thread.sleep(300);
            System.out.println("start to take value...");
            //程序会一直block在这里,直到队列里面有值,因为ArrayBlockingQueue里面实现了对锁的condition的控制
            System.out.println(runner.queue.take());
            new Thread(runner.new ComeIn()).start();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    class ComeIn implements Runnable {

        public void run() {
            for (int i = 0; i < 5; i++) {
                try {
                    queue.put("value" + i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

输出结果可以看到程序以一直blocking在take(),put线程无法执行

start to take value...