`
sdustyongz
  • 浏览: 89552 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用LinkedBlockingQueue实现生产者-消费者模式

 
阅读更多
由于LinkedBlockingQueue 实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。下面是一个例子,一看就明白了。

package com.spell.designPattern.producer_consumer;

import java.util.UUID;
import java.util.concurrent.BlockingQueue;

/**
* 生产者类,任务是产生个uuid放在队列中
*
* @author Administrator
*
*/
public class Producer implements Runnable {
    private BlockingQueue<String> queue;

    public Producer(BlockingQueue<String> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        String uuid = UUID.randomUUID().toString();
        try {
            queue.put(uuid);
            System.out
                    .println(Thread.currentThread() + " produce uuid:" + uuid);
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }

    }

}     

package com.spell.designPattern.producer_consumer;

import java.util.concurrent.BlockingQueue;

/**
* 消费者队列,任务是取得队列中的uuid打印下
*
* @author Administrator
*
*/
public class Consumer implements Runnable {
    private BlockingQueue<String> queue;

    public Consumer(BlockingQueue<String> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            String uuid = queue.take();
            System.out
                    .println(Thread.currentThread() + " consume uuid:" + uuid);
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }

    }
}     

package com.spell.designPattern.producer_consumer;

import java.util.concurrent.LinkedBlockingQueue;

/**
* 测试类
*
* @author Administrator
*
*/
public class Tester {

    public static void main(String[] args) throws InterruptedException {
        // 队列
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(10);
        // 生产者一号
        Producer producer = new Producer(queue);
        // 生产者二号
        Producer producer2 = new Producer(queue);
        // 消费者
        Consumer consumer = new Consumer(queue);

        for (int i = 0; i < 15; i++) {
            new Thread(producer).start();
        }

        for (int i = 0; i < 15; i++) {
            new Thread(producer2).start();
        }

        for (int i = 0; i < 30; i++) {
            new Thread(consumer).start();
        }
    }
}  
分享到:
评论

相关推荐

    Java多线程 生产者-消费者模式

    总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...

    多线程间通信:多生产者-多消费者实例

    总之,多生产者-多消费者模式是并发编程中的重要设计模式,通过合理利用同步机制,能够有效地解决线程间的通信问题,提高系统的并发性能。在Java中,我们可以借助`BlockingQueue`等工具实现这一模式,从而构建高效、...

    生产者/消费者模式 阻塞队列 LinkedBlockingQueue

    在Java中,阻塞队列(BlockingQueue)是一个很好的实现生产者/消费者模式的工具,而LinkedBlockingQueue则是Java并发包(java.util.concurrent)中提供的一个具体实现。 LinkedBlockingQueue是一个基于链表结构的...

    【IT十八掌徐培成】Java基础第08天-04.多线程-生产者-消费者.zip

    "生产者-消费者"模型是多线程问题中的经典案例,它揭示了如何通过线程间的协作来实现数据共享和高效利用资源。今天我们将深入探讨这个主题。 生产者-消费者模型是由两个主要角色构成:生产者和消费者。生产者负责...

    生产者消费者

    在Java中,`BlockingQueue`接口是实现生产者消费者模式的理想选择。`BlockingQueue`提供了线程安全的队列操作,并且内置了阻塞机制。当队列满时,`put()`方法会使得生产者线程自动阻塞,直至队列有空位;当队列空时...

    java模拟生产者和消费者问题

    Java的并发集合框架提供了`BlockingQueue`接口,它内置了线程安全性和阻塞行为,非常适合实现生产者-消费者模式。`BlockingQueue`有多个实现类,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等,它们自动处理阻塞...

    【IT十八掌徐培成】Java基础第08天-05.多线程-生产者-消费者2.zip

    通过理解并熟练运用生产者-消费者模式,开发者可以构建高效、可靠的多线程应用,处理并发问题,并优化系统资源的利用率。在Java中,这一模式的应用不仅限于简单的队列操作,还可以扩展到更复杂的并发场景,如分布式...

    生产者和消费者模式多线程

    生产者和消费者模式是多线程编程中一个经典的设计模式,它主要解决的是在多线程环境下资源的有效利用和同步问题。在这个模式中,生产者负责生成数据,而消费者负责消费这些数据。为了保证生产与消费的平衡以及避免...

    java实现生产者消费者

    总结,Java实现的生产者消费者模式利用`BlockingQueue`接口来协调生产者和消费者的动作,确保资源的有效管理和合理分配。通过这种方式,我们可以构建高效、稳定且线程安全的并发程序。在`src`文件夹中,可能包含的是...

    09 使用多线程实现分工、解耦、缓冲—生产者、消费者实战.pdf

    在实际的Java并发编程中,通常使用`BlockingQueue`接口及其实现(如`ArrayBlockingQueue`或`LinkedBlockingQueue`)来实现生产者-消费者模式。这些队列具有内置的线程同步机制,能够自动处理生产者和消费者的等待与...

    java 多线程 生产者消费者模式

    Java多线程编程是开发高...总结一下,Java中的生产者消费者模式利用了`BlockingQueue`等并发工具,实现了线程间的同步和协作,提高了程序的并发性能。理解并熟练运用这种模式,对于提升Java多线程编程的能力至关重要。

    生产者消费者模式在java中的应用

    4. `mine`目录下的源代码可能包含了作者自定义的生产者和消费者类,展示了如何利用`BlockingQueue`实现具体业务场景下的生产者消费者模式。 5. `create`目录下的源代码可能提供了另一种实现方式,可能包括不同的...

    多线程模拟实现生产者/消费者模型

    生产者/消费者模型是多线程编程中的一个经典设计模式,它有效地利用了资源,避免了数据竞争和阻塞问题。这个模型的核心思想是将生产者和消费者分隔开,使得生产者可以专注于创建产品,而消费者则专注于消耗这些产品...

    java生产者消费者模型

    Java中实现生产者消费者模型通常会用到以下关键概念和技术: 1. **阻塞队列(BlockingQueue)**:这是生产者消费者模型的核心组件,用于存储待消费的数据。Java的`java.util.concurrent`包提供了多种阻塞队列实现,...

    java线程实现的生产者和消费者的程序

    在Java中,我们可以利用`java.util.concurrent`包中的工具类来实现生产者消费者模式。其中,`BlockingQueue`接口是一个理想的候选,因为它提供了线程安全的数据结构,可以用于线程间的同步。`BlockingQueue`有多种...

    java版本的生产者与消费者

    在Java中,`ArrayBlockingQueue`或者`LinkedBlockingQueue`是实现生产者消费者模型的常见选择,因为它们都提供了内置的线程安全机制。`put()`方法用于生产者添加产品,`take()`方法用于消费者取出产品。 在实际应用...

    生产者消费者java源码

    在Java中,`BlockingQueue`接口是实现生产者消费者模式的关键组件。它提供了一种线程安全的数据结构,允许线程在尝试插入或删除元素时自动进行阻塞,直到操作可以执行。例如,`ArrayBlockingQueue`或`...

    生产者-消费者

    理解并实现生产者-消费者模式对于Java程序员来说至关重要,因为它能够帮助我们构建高效、可扩展的并发应用程序。通过熟练掌握这种模式,开发者可以在面临大量并发任务时,更好地管理资源,提高系统性能。

    生产者与消费者源代码

    以下是一个简单的Java生产者消费者模型的代码示例: ```java import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class ProducerConsumerExample { public ...

Global site tag (gtag.js) - Google Analytics