由于LinkedBlockingQueue
实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。
import java.util.UUID;
import java.util.concurrent.*;
/**
生产者类
*/
public class Producer implements Runnable {
BlockingQueue<String> queue = new BlockingQueue<String>();
public Producer(BlockingQueue queue) {
this.queue = queue;
}
public void run() {
String uuid = UUID.randomUUID ().toString ();
try {
queue.put (uuid);
System.out.println (Thread.currentThread () + “Producer uuid: ” + uuid);
} cacth (IntterruptedException e) {
e.printStackTrace ();
}
}
}
import java.util.concurrent.*;
/*消费者类*/
public class Consumer implements Runnable {
BlockingQueue<String> queue = new BlockingQueue<String>();
public Consumer(BlockingQueue queue) {
this.queue = queue;
}
public void run () {
try {
Sting uuid = queue.take ();
System.out.println (Thread.currentThread () + “Consumer uuid: ” + uuid);
} catch(IntterruptedException e) {
e.printStackTrace ();
}
}
}
import java.util.concrrent.*;
/*测试类*/
public class TestProducer_Consumer {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(10);
Producer p1 = new Prodcuer(queue);
Producer p2 = new Producer(queue);
Consumer c = new Consumer(queue);
for(int i=0; i<15; ++i) {
new Thread(p1).start();
}
for(int i=0; i<15; ++i) {
new Thread(p2).start();
}
for(int i=0; i<30; ++i) {
new Thread(c).start();
}
}
分享到:
相关推荐
生产者消费者问题的核心在于如何有效地协调生产者和消费者之间的交互,确保生产者不会在缓冲区满时继续生产,而消费者也不会在缓冲区空时尝试消费。这个问题可以通过使用同步机制来解决,如Java中的`wait()`、`...
"生产者-消费者"模型是多线程问题中的经典案例,它揭示了如何通过线程间的协作来实现数据共享和高效利用资源。今天我们将深入探讨这个主题。 生产者-消费者模型是由两个主要角色构成:生产者和消费者。生产者负责...
通过理解并熟练运用生产者-消费者模式,开发者可以构建高效、可靠的多线程应用,处理并发问题,并优化系统资源的利用率。在Java中,这一模式的应用不仅限于简单的队列操作,还可以扩展到更复杂的并发场景,如分布式...
《生产者消费者问题详解及Java实现》 生产者消费者问题是多线程编程中常见的一个经典问题,它涉及到并发控制、同步机制以及队列数据结构的使用。本报告将深入探讨这个问题,结合Java语言进行详细解析,并提供实际的...
在Java中,阻塞队列(BlockingQueue)是一个很好的实现生产者/消费者模式的工具,而LinkedBlockingQueue则是Java并发包(java.util.concurrent)中提供的一个具体实现。 LinkedBlockingQueue是一个基于链表结构的...
BlockingQueue 的核心设计是其在并发环境下提供了高效的同步机制,实现了生产者-消费者模式。 BlockingQueue 支持以下两种附加操作: 1. 当 Queue 为空时,调用 `take()` 或 `poll()` 方法尝试获取元素的线程会被...
6. **LinkedBlockingQueue** 和 **ConcurrentLinkedQueue** 是线程安全的队列实现,常用于多线程环境下的并发编程,它们实现了`Queue`接口。 7. **Collections** 类是集合框架的一个工具类,提供了静态方法来操作...
在Android开发中,生产者-消费者模式是一种常见的多线程设计模式,用于处理并发问题,尤其是在数据处理和异步操作中。这个模式的核心思想是通过一个共享的数据缓冲区,使得生产者线程可以生成数据并放入缓冲区,而...
Java多线程编程是开发高...总结一下,Java中的生产者消费者模式利用了`BlockingQueue`等并发工具,实现了线程间的同步和协作,提高了程序的并发性能。理解并熟练运用这种模式,对于提升Java多线程编程的能力至关重要。
总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...
生产者和消费者模式是多线程编程中一个经典的设计模式,它主要解决的是在多线程环境下资源的有效利用和同步问题。在这个模式中,生产者负责生成数据,而消费者负责消费这些数据。为了保证生产与消费的平衡以及避免...
总结,Java实现的生产者消费者模式利用`BlockingQueue`接口来协调生产者和消费者的动作,确保资源的有效管理和合理分配。通过这种方式,我们可以构建高效、稳定且线程安全的并发程序。在`src`文件夹中,可能包含的是...
8. **并发设计模式**:如生产者-消费者模式,其中生产者将任务放入队列,消费者从队列中取出并执行任务。这种模式在多线程并发编程中非常常见。 9. **异常处理**:在多线程环境中,正确处理异常是至关重要的,以...
Java线程池的几种实现方法和区别介绍 使用:LinkedBlockingQueue实现线程池讲解
7. **动态代理**:Java 6通过`java.lang.reflect.Proxy`和`java.lang.invoke`包提供了动态代理的实现,可以方便地创建接口的动态实现。 8. **国际化(i18n)与本地化(l10n)**:JDK 6.0提供了更强大的国际化支持,...
通过理解并熟练掌握生产者消费者模型,开发者可以有效地设计出高效、稳定的并发程序,提高系统资源利用率,并降低线程之间的竞争。在实际项目中,生产者消费者模型被广泛应用于缓存管理、数据库批量操作、消息队列等...
`java.util.concurrent`包提供了`BlockingQueue`接口及其实现,如`ArrayBlockingQueue`、`LinkedBlockingQueue`,它们是线程安全的队列,可用于线程间的数据传递。 通过阅读“java多线程编程总结.pdf”,读者将...
4. `mine`目录下的源代码可能包含了作者自定义的生产者和消费者类,展示了如何利用`BlockingQueue`实现具体业务场景下的生产者消费者模式。 5. `create`目录下的源代码可能提供了另一种实现方式,可能包括不同的...
6. **并发设计模式**:如生产者消费者模型、读写锁策略、双检锁/双重校验锁(DCL)、线程局部变量(ThreadLocal)等,这些都是解决并发问题的常用设计模式。 7. **J.U.C(Java并发工具包)**:这部分将详细介绍`...