java并发-BlockingQueue-阿里云开发者社区

开发者社区> jackcooper2015> 正文

java并发-BlockingQueue

简介: java.util.concurrent.BlockingQueue 接口有以下阻塞队列的实现 ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.
+关注继续查看

java.util.concurrent.BlockingQueue 接口有以下阻塞队列的实现

  • ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的.
  • LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的
  • PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序.
  • SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的.

FIFO 队列 :LinkedBlockingQueue、ArrayListBlockingQueue(固定长度)
优先级队列 :PriorityBlockingQueue

提供了阻塞的 take() 和 put() 方法:如果队列为空 take() 将阻塞,直到队列中有内容;如果队列为满 put() 将阻塞,指到队列有空闲位置。

package com.br.lucky.utils;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * @author 10400
 * @create 2018-04-20 1:52
 */
public class BlockingQueueDemo {

    private static BlockingQueue<String> queue = new ArrayBlockingQueue<>(5);

    private static class Producer extends Thread {
        @Override
        public void run() {
            try {
                Thread.sleep(5000);
                double random = Math.random();
                queue.put(""+random);
                System.out.println("produce :" + random);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private static class Consumer extends Thread {

        @Override
        public void run() {
            try {
                Thread.sleep(3000);
                String product = queue.take();
                System.out.println("consume :"+product);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            Producer producer = new Producer();
            producer.start();
        }
        for (int i = 0; i < 5; i++) {
            Consumer consumer = new Consumer();
            consumer.start();
        }
        for (int i = 0; i < 3; i++) {
            Producer producer = new Producer();
            producer.start();
        }
    }
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java多线程高并发学习笔记(二)——深入理解ReentrantLock与Condition
锁的概念 从jdk发行1.5版本之后,在原来synchronize的基础上,增加了重入锁ReentrantLock。 本文就不介绍synchronize了,有兴趣的同学可以去了解一下,本文重点介绍ReentrantLock。
1059 0
java 并发——理解 wait / notify / notifyAll
java 并发——理解 wait / notify / notifyAll一、前言前情简介:java 并发——内置锁java 并发——线程 java 面试是否有被问到过,sleep 和 wait 方法的区别,关于这个问题其实不用多说,大多数人都能回答出最主要的两点区别: sleep 是线程的方法, wait / notify / notifyAll 是 Object 类的方法;sleep 不会释放当前线程持有的锁,到时间后程序会继续执行,wait 会释放线程持有的锁并挂起,直到通过 notify 或者 notifyAll 重新获得锁。
1599 0
Java并发基础
并发:多个线程操作相同的资源,保证线程安全,合理使用资源 高并发:服务能同时处理很多请求,提高程序性能 (12306抢票,双十一) 关于高并发的一些基础的概念 CPU多级缓存 在Cache(高速缓存出现之后,系统变得更加复杂,高速缓存与主存之间的差异被拉大。
844 0
Java 并发/多线程教程(六)-并发VS并行
       本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获。由于个人水平有限,不对之处还望矫正!         在多线程线程编程中,我们经常提及并发和并行,但是并发和并行究竟是什么意思,他们所要表达是同一回事,还是不是同一加事。
1235 0
+关注
jackcooper2015
用心做人,专心做事
38
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载