原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871704.html

Java线程--BlockingQueue使用

阻塞队列就是内容满了之后, 就开始阻塞, 直到有消费者消费了东西之后才又开始生产, 看代码:

package concurrent.blockingqueue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicInteger; /**
* 生产者
*/
public class Producer implements Runnable { /**
* 计数器
*/
private static AtomicInteger k = new AtomicInteger(0);
BlockingQueue queue; public Producer(BlockingQueue queue) {
this.queue = queue;
} @Override
public void run() {
while (true) {
try {
/**
* 把生产出来的东西丢进队列中去
*/
queue.put(produce());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} /**
* 生产东西, 然后返回出去
* @return
* @throws InterruptedException
*/
private AtomicInteger produce() throws InterruptedException {
k.addAndGet(1);
System.out.println("生产者开始生产东西了... " + k);
return k;
}
}
package concurrent.blockingqueue;

import java.util.concurrent.BlockingQueue;

/**
* 消费者
*/
public class Consumer implements Runnable { BlockingQueue queue; public Consumer(BlockingQueue queue){
this.queue = queue;
} @Override
public void run() {
while (true) {
try {
/**
* 延迟3秒再从队列中取出,
* 这样就可以看到生产队列生产满了之后就停止生产,
* 直到消费者消费了之后再继续生产
*/
Thread.sleep(3000);
consume(queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} /**
* 消费东西
* @param o
*/
void consume(Object o){
System.out.println("消费者开始消费东西了.... " + o);
}
}
package concurrent.blockingqueue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue; /**
* main 测试类
*/
public class MainTest {
public static void main(String[] args) {
/**
* 搞一个阻塞队列容量为3, 当超过容量就开始堵塞
*/
BlockingQueue queue = new ArrayBlockingQueue(3);
new Thread(new Producer(queue)).start();
new Thread(new Consumer(queue)).start();
}
}

看打印结果:

生产者开始生产东西了... 1
生产者开始生产东西了... 2
生产者开始生产东西了... 3
生产者开始生产东西了... 4
消费者开始消费东西了.... 4
生产者开始生产东西了... 5
消费者开始消费东西了.... 5
生产者开始生产东西了... 6
消费者开始消费东西了.... 6
生产者开始生产东西了... 7
消费者开始消费东西了.... 7
生产者开始生产东西了... 8
消费者开始消费东西了.... 8
生产者开始生产东西了... 9
消费者开始消费东西了.... 9
生产者开始生产东西了... 10

这个结果很明显了.

Java线程--BlockingQueue使用的更多相关文章

  1. Java线程和多线程(十一)——BlockingQueue

    这次讨论的是Java的BlockingQueue,java.util.concurrent.BlockingQueue是一个Java的队列接口,支持一系列操作,比如,在获取和移除对象的时候如果队列为空 ...

  2. 转:JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue

    从Java5开始,Java提供了自己的线程池.每次只执行指定数量的线程,java.util.concurrent.ThreadPoolExecutor 就是这样的线程池.以下是我的学习过程. 首先是构 ...

  3. java线程(7)——阻塞队列BlockingQueue

    回顾: 阻塞队列,英文名叫BlockingQueue.首先他是一种队列,联系之前Java基础--集合中介绍的Queue与Collection,我们就很容易开始今天的阻塞队列的学习了.来看一下他们的接口 ...

  4. JAVA线程队列BlockingQueue

    JAVA线程队列BlockingQueue 介绍 BlockingQueue阻塞队列,顾名思义,首先它是一个队列,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出. 常用的队列主要有以 ...

  5. Java线程并发:知识点

    Java线程并发:知识点   发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用.   逃逸:在对象尚未准备 ...

  6. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  7. 【转载】 Java线程面试题 Top 50

    Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...

  8. Java线程新特征——Java并发库

    一.线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...

  9. Java线程池使用说明

    Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...

随机推荐

  1. 初识python 之 ImportError: No module named _ssl

    场景 安装好python之后,导入ssl模块报错: ImportError: No module named _ssl 解决方法 查看openssl.openssl-devel是否安装 rpm -qa ...

  2. 初识python 之 自动拆分转换文本内容

    上一篇升级版,转换文件内容. #!/user/bin env python # author:Simple-Sir # time:2021/7/9 23:32 def txt_2_list(filen ...

  3. 获取python的版本

    import sys # Syntax sugar. _ver = sys.version_info # 获取python版本 #: Python 2.x? is_py2 = (_ver[0] == ...

  4. Bash 取字符串的最后 N 个字符 - ${str:0-N:LENGTH}

    Bash 取字符串的最后 N 个字符: ${str:0-N:LENGTH} or ${str:0-N} https://tldp.org/LDP/abs/html/string-manipulatio ...

  5. vue部署服务器以及解决部署到apache路由出现404

    最近在开发cms的时候使用Vue.js框架,利用vue-route.vue-cli结合webpack编写了一个单页路由项目,自己在服务器端配置apache.部署完成后,访问没问题,从页面中点击跳转就会 ...

  6. 离线下载第三方Python包

    1.进入Python第三方包下载地(https://pypi.org/)搜索自己需要的包 2.下载需要的包的版本 3.将.whl格式的文件更改为.zip文件,并且解压 4.将解压的2个文件放到Pyth ...

  7. 【hexo指南】hexo配置ER图流程图时序图插件

    偏技术的文章有时会用到各种图形,一般来说可以做好图然后截图放到文章中就好了,虽然但图片本身也很小,但存一大堆图片占用空间总觉得不是很好. mermaid mermaid官方网站 mermaid支持很多 ...

  8. java实现excel表格导入数据库表

    导入excel就是一个上传excel文件,然后获取excel文件数据,然后处理数据并插入到数据库的过程 一.上传excel 前端jsp页面,我的是index.jsp 在页面中我自己加入了一个下载上传文 ...

  9. macos下命令行通过ndk编译android下可以执行的ELF程序(并验证opencl的调用)

    源码如下,实现把一个JPG保存成灰度图格式的BMP 1 //jpg2bmp.cpp 2 #include <stdio.h> 3 #include <inttypes.h> 4 ...

  10. Cesium入门1 - Cesium介绍

    Cesium入门1 - Cesium介绍 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium简介 Ce ...