转自: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
分享到:
相关推荐
### Java多线程-生产者与消费者问题 #### 一、生产者与消费者问题概览 **1.1 概要** 生产者与消费者问题是计算机科学中一个多线程同步的经典问题。它描述了两个线程如何共享有限资源的场景:一个是生产者...
本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...
在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...
在本场景中,我们关注的是"生产者-消费者模型",这是一个经典的并发问题,通常用于展示线程间的协作与同步。这个模型是基于一个假设:有一个缓冲区,生产者线程负责往里面放入产品,而消费者线程则负责取出并消费...
【生产者消费者问题】是多线程编程中的经典问题,主要涉及到进程同步和互斥的概念。在操作系统中,生产者负责生成数据,而消费者则负责消耗这些数据。两者通过一个有限大小的缓冲区进行交互,当缓冲区满时,生产者...
"典型的多线程--生产和消费"这个主题,通常指的是生产者-消费者问题,这是一种经典的设计模式,用于解决如何在一个数据结构(如队列)中高效地存储和检索数据,同时避免生产者过于快速地生成数据而消费者无法及时...
### Linux下的多线程实例——生产者消费者模型 在Linux环境下进行多线程编程时,一个常见的应用场景就是通过生产者消费者模型来管理线程间的通信和数据共享问题。本篇文章将详细解析一个基于Linux环境下的多线程...
在Java编程中,"线程同步--生产者消费者问题"是一个经典的多线程问题,它涉及到如何有效地在多个线程之间共享资源。这个问题通常用于演示和理解线程间的协作机制,如互斥锁、条件变量等。在此,我们将深入探讨这个...
在本场景中,我们关注的是一个经典的多线程问题——"生产者-消费者"模式。这个模式是解决资源管理与同步问题的一个有效策略,它在操作系统、并发编程和分布式系统等领域广泛应用。 生产者-消费者模型涉及到两个主要...
生产者-消费者实例可以很好帮助初学java的同学们理解和学习多线程的知识
生产者-消费者问题是操作系统中经典的问题之一,它是指在多线程环境下,多个生产者线程和消费者线程访问同一个共享缓冲区,导致缓冲区的数据混乱和不一致的问题。 在解决生产者-消费者问题时,需要使用同步机制来...
在本示例中,“java多线程例子-生产者消费者”旨在展示如何利用多线程来实现生产者和消费者模式。这种模式是并发编程中的经典设计模式,用于协调生产数据和消费数据的两个不同线程。 生产者消费者模式的基本概念是...
"生产者-消费者"模型是多线程问题中的经典案例,它揭示了如何通过线程间的协作来实现数据共享和高效利用资源。今天我们将深入探讨这个主题。 生产者-消费者模型是由两个主要角色构成:生产者和消费者。生产者负责...
生产者-消费者模式是一种经典的多线程设计模式,用于解决数据共享问题,尤其是在一个线程生产数据而另一个线程消费数据的情况下。在这个模式中,生产者负责生成数据并放入共享的数据结构(如队列),而消费者则从这...
本文将详细地阐述 Linux 下利用互斥锁、条件变量、线程管理等相关函数实现多线程生产者-消费者问题,以提高资源利用率。 线程基本概念 线程是进程的一条执行路径,它包含独立的堆栈和 CPU 寄存器状态,每个线程...
生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...
"生产者-消费者"模式是多线程编程中的一个经典设计模式,它体现了线程间的协作和同步。在这个模式中,"生产者"线程负责创建资源,而"消费者"线程则负责消耗这些资源。这个模式在实际应用中非常常见,例如在消息队列...
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
"生产者消费者"模式是多线程应用中一个经典的范例,它通过线程间的协作来实现数据处理的高效与同步。这个模式的核心思想是将任务分为两个角色:生产者(Producer)和消费者(Consumer)。生产者负责生成数据,而消费...
生产者-消费者问题是多线程同步的一个经典案例,主要探讨如何在并发环境下,确保生产者进程和消费者进程之间正确地共享资源,避免数据竞争和死锁。在这个问题中,生产者进程负责创建产品并将产品放入缓冲区,而消费...