Java多线程之生产者和消费者模式解析
来源:互联网 发布:mac 打字突然变成韩文 编辑:程序博客网 时间:2024/06/08 19:20
前言
之前一直不明白生产者和消费者模式的实现方式,懂得原理,旧版的实现方式代码比较冗余。所以这里采用一种比较推荐的方式来实现。
BlockingQueue阻塞队列介绍
LinkedBlockingQueue
由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。
具体代码实现:
先编写生产者
import java.util.concurrent.BlockingQueue;public class ProducerQueue implements Runnable{ private final BlockingQueue proQueue; public ProducerQueue(BlockingQueue proQueue) { this.proQueue = proQueue; } @Override public void run() { for (int i=1;i<=10;i++) { try { System.out.println("生产者生产的产品编号为 : " +i); proQueue.put(i); Thread.sleep(3000); //为了容易辨别,等待3s } catch (InterruptedException e) { // TODO: handle exception e.printStackTrace(); } } }}
消费者
import java.util.concurrent.BlockingQueue;public class ConsumerQueue implements Runnable { private final BlockingQueue conQueue; public ConsumerQueue(BlockingQueue conQueue) { this.conQueue = conQueue; } @Override public void run() { for (;;) { try { System.out.println("消费者消费的产品编号为 :" +conQueue.take()); Thread.sleep(3000); } catch (InterruptedException e) { // TODO: handle exception e.printStackTrace(); } } }}
在main()方法里运行
import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;public class Test { public static void main(String[] args) { BlockingQueue publicBoxQueue = new LinkedBlockingQueue(2); //存放两个对象,一个生产者,一个消费者 Thread con = new Thread(new ConsumerQueue(publicBoxQueue)); Thread pro = new Thread(new ProducerQueue(publicBoxQueue)); pro.start(); con.start(); }}
实现结果:
使用BlockingQueue方式的生产者和消费者无论从逻辑上还是代码量上都比原始的方式简单。推荐使用这种方式
阅读全文
0 0
- Java多线程之生产者和消费者模式解析
- java多线程之消费者生产者模式
- Java多线程之消费者生产者模式
- java多线程之消费者生产者模式
- java多线程之消费者生产者模式
- java多线程之消费者生产者模式
- java多线程之消费者生产者模式
- java多线程之消费者生产者模式
- Java多线程之生产者消费者模式
- Java多线程之三生产者消费者模式
- Java多线程之生产者-消费者模式
- Java多线程之生产者-消费者模式
- java多线程之生产者消费者模式
- 多线程之生产者和消费者模式
- 多线程之生产者和消费者模式
- java多线程之生产者和消费者模型
- Java多线程-通信之生产者和消费者
- java多线程之生产者和消费者案例
- [莫比乌斯函数][分段] hdu6053 TrickGCD (2017 Multi-University Training Contest
- Maven:安装过程以及在eclipse上的使用
- 之前写的扯淡定时执行
- Android 双开沙箱 VirtualApp 源码分析(六)ContentProvider
- 工作日常用到的一些命令
- Java多线程之生产者和消费者模式解析
- 646. Maximum Length of Pair Chain
- 华为OJ——查找输入整数二进制中1的个数
- centos下安装mongo数据库及php扩展
- Session
- 阿里云Ubuntu搭建PPTP VPN
- Linux 本地文件或文件夹上传服务器
- SVD深入理解
- ajax返回的数据类型如何选择