JDK1.5 生产消费者

编程技术  /  houtizong 发布于 3年前   79

ArrayBlockingQueue

       一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。

ArrayBlockingQueue的常用方法:

       put:将指定的元素添加到此队列的尾部,如果必要,将等待可用的空间。

       take:检索并移除此队列的头部,如果此队列不存在任何元素,则一直等待。

       offer:将指定的元素插入到此队列的尾部(如果可能),如果此队列已满,则立即返回。

       poll:检索并移除此队列的头,如果此队列为空,则返回null

说明:putoffer都是向队列中添加元素,takepoll都是从队列中移除元素。puttake对应一组,是阻塞式的;offerpoll对应一组,是非阻塞式的。

 

实例:

package com.bijian.thread;import java.util.concurrent.BlockingQueue;public class Producer implements Runnable {private String name = null;private BlockingQueue<String> queue = null;public Producer(String name, BlockingQueue<String> queue) {this.name = name;this.queue = queue;}@Overridepublic void run() {try {for (int i = 0; i < 10; i++) {queue.put(name + ": " + i);System.out.println("Product:" + name + ": " + i);Thread.sleep((long) (Math.random() * 1000));}} catch (Exception e) {e.printStackTrace();}}}

 

package com.bijian.thread;import java.util.concurrent.BlockingQueue;public class Consumer implements Runnable {private String name;private BlockingQueue<String> queue = null;public Consumer(String name, BlockingQueue<String> queue) {this.name = name;this.queue = queue;}@Overridepublic void run() {try {for (int i = 0; i < 5; i++) {String prod = queue.take();System.out.println("Consumer:" + name + ": " + prod);Thread.sleep((long) (Math.random() * 1000));}} catch (Exception e) {e.printStackTrace();}}}

 

package com.bijian.thread;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {BlockingQueue<String> queue = new ArrayBlockingQueue<String> (3);ExecutorService service = Executors.newCachedThreadPool();        Producer producer = new Producer("P1", queue);    Consumer consumer = new Consumer("C1", queue);    Consumer consumer1 = new Consumer("C2", queue);    service.execute(producer);    service.execute(consumer);    service.execute(consumer1);    service.shutdown();    }}

 

运行结果:
Product:P1: 0Consumer:C1: P1: 0Product:P1: 1Consumer:C2: P1: 1Product:P1: 2Consumer:C1: P1: 2Product:P1: 3Consumer:C2: P1: 3Product:P1: 4Consumer:C1: P1: 4Product:P1: 5Consumer:C2: P1: 5Product:P1: 6Consumer:C1: P1: 6Product:P1: 7Consumer:C2: P1: 7Product:P1: 8Product:P1: 9Consumer:C1: P1: 8Consumer:C2: P1: 9

 

上一篇:JDK1.5 Queue

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客