原创:转载需注明原创地址 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. Docker | dockerfile 文件编写

    dockerfile 的作用 dockerfile 作用就是制作镜像,保持开发,测试,生产环境的一致性. 直接将容器制作为镜像 制作新的镜像 # 把容器按照自己的需求个性完之后,就可以创建自己的镜像的 ...

  2. Log4j2日志框架集成Slf4j日志门面

    1.说明 本文介绍使用日志门面Slf4j打印日志, 底层日志实现使用Log4j2框架, 方便以后切换底层日志实现, Log4j2可以替换成Logback等. 2.依赖管理 在pom.xml依赖管理中导 ...

  3. Zookeeper基础教程(六):.net core使用Zookeeper

    Demo代码已提交到gitee,感兴趣的更有可以直接克隆使用,地址:https://gitee.com/shanfeng1000/dotnetcore-demo/tree/master/Zookeep ...

  4. Nginx-正反向代理及负载均衡

    目录 正/反向代理 代理的方式 Nginx代理服务支持的协议 代理实战 部署web01 部署Lb01 Nginx代理常用参数 添加发往后端服务器的请求头信息 代理到后端的TCP连接.响应.返回等超时时 ...

  5. TYPESCRIPT中文教程基础部分下----翻译自TS官方

    type 别名 我们已经使用过 object 和 联合的方式 直接声明类型.但是某个类型在使用多次的情况下就要用到别名了. 别名的语法就像是在定义一个具名的对象一样: type Point = { x ...

  6. 桥接模式(python)

    from abc import ABCMeta, abstractmethod class Shape(metaclass=ABCMeta): def __init__(self, color): s ...

  7. 详解nohup /dev/null 2>&1 含义的使用

    https://www.jb51.net/article/169837.htm 这篇文章主要介绍了详解nohup /dev/null 2>&1 含义的使用,文中通过示例代码介绍的非常详细 ...

  8. 基于ShardingJDBC的分库分表详细整理

    转载 https://www.cnblogs.com/jackion5/p/13658615.html 前言 传统应用项目设计通常都是采用单一数据库作为存储方案,但是随着互联网的迅猛发展以及应用数据量 ...

  9. 新增访客数量MR统计之数据库准备

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...

  10. httprunner3.x全网最详细教程

    一.所需环境 wiindows10以上 python3.6以上 httprunner3.1.6(最新版本) pycharm社区版 二.安装httprunner 1.卸载旧版本 卸载之前版本的命令为:p ...