转自:http://bijian1013.iteye.com/blog/1871763
ArrayBlockingQueue:
一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。
ArrayBlockingQueue的常用方法:
put:将指定的元素添加到此队列的尾部,如果必要,将等待可用的空间。
take:检索并移除此队列的头部,如果此队列不存在任何元素,则一直等待。
offer:将指定的元素插入到此队列的尾部(如果可能),如果此队列已满,则立即返回。
poll:检索并移除此队列的头,如果此队列为空,则返回null。
说明:put、offer都是向队列中添加元素,take、poll都是从队列中移除元素。put和take对应一组,是阻塞式的;offer、poll对应一组,是非阻塞式的。
实例:
Java代码
1.package com.bijian.thread;
2.
3.import java.util.concurrent.BlockingQueue;
4.
5.public class Producer implements Runnable {
6.
7. private String name = null;
8. private BlockingQueue<String> queue = null;
9.
10. public Producer(String name, BlockingQueue<String> queue) {
11. this.name = name;
12. this.queue = queue;
13. }
14.
15. @Override
16. public void run() {
17.
18. try {
19. for (int i = 0; i < 10; i++) {
20. queue.put(name + ": " + i);
21. System.out.println("Product:" + name + ": " + i);
22. Thread.sleep((long) (Math.random() * 1000));
23. }
24. } catch (Exception e) {
25. e.printStackTrace();
26. }
27. }
28.}
Java代码
1.package com.bijian.thread;
2.
3.import java.util.concurrent.BlockingQueue;
4.
5.public class Consumer implements Runnable {
6.
7. private String name;
8. private BlockingQueue<String> queue = null;
9.
10. public Consumer(String name, BlockingQueue<String> queue) {
11. this.name = name;
12. this.queue = queue;
13. }
14.
15. @Override
16. public void run() {
17.
18. try {
19. for (int i = 0; i < 5; i++) {
20. String prod = queue.take();
21. System.out.println("Consumer:" + name + ": " + prod);
22. Thread.sleep((long) (Math.random() * 1000));
23. }
24. } catch (Exception e) {
25. e.printStackTrace();
26. }
27. }
28.}
Java代码
1.package com.bijian.thread;
2.
3.import java.util.concurrent.ArrayBlockingQueue;
4.import java.util.concurrent.BlockingQueue;
5.import java.util.concurrent.ExecutorService;
6.import java.util.concurrent.Executors;
7.
8.public class Main {
9.
10. public static void main(String[] args) {
11.
12. BlockingQueue<String> queue = new ArrayBlockingQueue<String> (3);
13.
14. ExecutorService service = Executors.newCachedThreadPool();
15. Producer producer = new Producer("P1", queue);
16. Consumer consumer = new Consumer("C1", queue);
17. Consumer consumer1 = new Consumer("C2", queue);
18. service.execute(producer);
19. service.execute(consumer);
20. service.execute(consumer1);
21. service.shutdown();
22. }
23.}
运行结果:
Text代码
1.Product:P1: 0
2.Consumer:C1: P1: 0
3.Product:P1: 1
4.Consumer:C2: P1: 1
5.Product:P1: 2
6.Consumer:C1: P1: 2
7.Product:P1: 3
8.Consumer:C2: P1: 3
9.Product:P1: 4
10.Consumer:C1: P1: 4
11.Product:P1: 5
12.Consumer:C2: P1: 5
13.Product:P1: 6
14.Consumer:C1: P1: 6
15.Product:P1: 7
16.Consumer:C2: P1: 7
17.Product:P1: 8
18.Product:P1: 9
19.Consumer:C1: P1: 8
20.Consumer:C2: P1: 9
分享到:
相关推荐
linux下的多线程实例--生产者消费者 linux下的多线程实例--生产者消费者
Java多线程--生产者与消费者问题
多线程--生产者消费者问题[1][收集].pdf
编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。
操作系统实验 多线程实现生产者---消费者模型 华工版 绝对好用。。。。。。。
【IT十八掌徐培成】Java基础第08天-04.多线程-生产者-消费者.zip
【IT十八掌徐培成】Java基础第08天-05.多线程-生产者-消费者2.zip
java多线程实现生产者和消费者
生产者-消费者实例可以很好帮助初学java的同学们理解和学习多线程的知识
生产者-消费者问题是操作系统中经典的问题之一,它是指在多线程环境下,多个生产者线程和消费者线程访问同一个共享缓冲区,导致缓冲区的数据混乱和不一致的问题。 在解决生产者-消费者问题时,需要使用同步机制来...
本文将详细地阐述 Linux 下利用互斥锁、条件变量、线程管理等相关函数实现多线程生产者-消费者问题,以提高资源利用率。 线程基本概念 线程是进程的一条执行路径,它包含独立的堆栈和 CPU 寄存器状态,每个线程...
c#多线程之生产者消费者
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 ...
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
用多线程实现1个生产者,2个消费者模式:1、生产者生产的同时消费者不能消费2、消费者消费的同时生产者不能生产3、共享空间空的时候消费者不能继续消费4、共享空间满的时候生产者不能继续生产。
a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题
Linux 多线程实现生产者消费者模式.pdf
使用一个共享队列,生产者把产品放入队列,消费者消费产品,实现简单的多线程示例.
使用多线程实现了生产者和消费者模式