Java多线程探究-阻塞队列

Java 中的阻塞队列

Java多线程探究-阻塞队列_第1张图片
BlockingQueue 方法以四种形式出现,对于不能立即满足但可能在将来某一时刻可以满足的操作,这四种形式的处理方式不同:第一种是抛出一个异常,第二种是返回一个特殊值(null 或 false,具体取决于操作),第三种是在操作可以成功前,无限期地阻塞当前线程,第四种是在放弃前只在给定的最大时间限制内阻塞。下表中总结了这些方法:
Java多线程探究-阻塞队列_第2张图片
BlockingQueue接口主要有几种实现的队列
1. ArrayBlockQueue:一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。创建其对象必须明确大小,像数组一样。
2. LinkedBlockQueue:一个可改变大小的阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。创建其对象如果没有明确大小,默认值是Integer.MAX_VALUE。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。
3. PriorityBlockingQueue:类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序。
4. SynchronousQueue:同步队列。同步队列没有任何容量,每个插入必须等待另一个线程移除,反之亦然

Java队列的使用

下面是一个使用阻塞队列实现的生产者-消费者模型

class Obj{
    private ArrayBlockingQueue queue = new ArrayBlockingQueue<>(1); 
//    private SynchronousQueue queue = new SynchronousQueue<>();

    public String getEgg(){
        try {
            return queue.take();

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }
    public void  putEgg(String egg){
        try {
            queue.put(egg);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
public class BlockTest {
    public static void main(String[] args) {

        final Obj obj  = new Obj();
        for(int i = 0; i < 3 ; i++){
            new Thread(){
                @Override
                public void run(){
                    while(true){
                        obj.putEgg("egg");
                        System.out.println(Thread.currentThread().getName()+" 放入一个egg+++");
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                }
            }.start();
        }
        for(int i = 0 ; i < 1 ; i++){
            new Thread(){
                @Override
                public void run(){
                    while(true){
                        obj.getEgg();
                        System.out.println(Thread.currentThread().getName()+ "取出一个egg---");
                        System.out.println("");
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
        }
    }
}

输出结果
Java多线程探究-阻塞队列_第3张图片

你可能感兴趣的:(Java)