`
huangjinjin520
  • 浏览: 71099 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

生产者-消费者模式实现

阅读更多
生产者是指:生产数据的线程
消费者是指:使用数据的线程
生产者和消费者是不同的线程,他们处理数据的速度是不一样的,一般在二者之间还要加个“桥梁参与者”,用于缓冲二者之间处理数据的速度差。
下面用代码来说明:
//生产者  
public class MakerThread extends Thread { 
    private final Random random; 
    private final Table table; 
    private static int id = 0;  
    public MakerThread(String name, Table table, long seed) { 
        super(name); 
        this.table = table;//table就是桥梁参与者  
        this.random = new Random(seed); 
    } 
    public void run() { 
        try { 
            while (true) { 
                Thread.sleep(random.nextInt(1000));//生产数据要耗费时间  
                //生产数据
                String cake = "[ Cake No." + nextId() + " by " + getName() + " ]";  
                table.put(cake);//将数据存入桥梁参与者  
            } 
        } catch (InterruptedException e) { 
        } 
    } 
    private static synchronized int nextId() { 
        return id++; 
    } 


再来看看消费者:
//消费者线程
public classEaterThread extends Thread {
    private final Random random;
    private final Table table;
    public EaterThread(String name, Table table,long seed) {
        super(name);
        this.table = table;
        this.random = new Random(seed);
    }
    public void run() {
        try {
            while (true) {
                String cake = table.take();//从桥梁参与者中取数据
               Thread.sleep(random.nextInt(1000));//消费者消费数据要花时间
            }
        } catch (InterruptedException e) {
        }
    }
}
看来在这个模式里table是个很重要的角色啊,让我们来看看他吧(这里只给出个简单的):
public class Table { 
    private final String[] buffer; 
    private int tail;  //下一个放put(数据)的地方   
    private int head;  //下一个取take(数据)的地方  
    private int count; // buffer内的数据数量  
    public Table(int count) { 
        this.buffer = new String[count];//总量是确定的  
        this.head = 0; 
        this.tail = 0; 
        this.count = 0; 
    } 
    // 放置数据  
    public synchronized void put(String cake) throws InterruptedException { 
        System.out.println(Thread.currentThread().getName() + " puts " + cake); 
        while (count >= buffer.length) {//数据放满了就只能等待  
            wait(); 
        } 
        buffer[tail] = cake; 
        tail = (tail + 1) % buffer.length; 
        count++; 
        notifyAll();//有数据了,唤醒线程去取数据  
    } 

    // 取得数据  
    public synchronized String take() throws InterruptedException { 
        while (count <= 0) {//没有数据就只能等待  
            wait(); 
        } 
        String cake = buffer[head]; 
        head = (head + 1) % buffer.length; 
        count--; 
        notifyAll();//有位置可以放数据了,唤醒线程,不等了  
        System.out.println(Thread.currentThread().getName() + " takes " + cake); 
        return cake; 
    } 
}

好了我们来实验吧:
public class Main { 
    public static void main(String[] args) { 
        Table table = new Table(3);     // 建立可以放置数据的桥梁参与者,3是他所能放置的最大数量的数据。
        new MakerThread("MakerThread-1", table, 31415).start();//生产数据  
        new MakerThread("MakerThread-2", table, 92653).start(); 
        new MakerThread("MakerThread-3", table, 58979).start(); 
        new EaterThread("EaterThread-1", table, 32384).start();//消费数据  
        new EaterThread("EaterThread-2", table, 62643).start(); 
        new EaterThread("EaterThread-3", table, 38327).start(); 
    } 


spring视频获取 dubbo视频获取

  • 大小: 39.9 KB
0
0
分享到:
评论

相关推荐

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

    在Java中,我们可以使用`java.util.concurrent`包中的工具类来实现生产者-消费者模式。`BlockingQueue`接口是最常用的实现方式,它提供了线程安全的数据结构,可以用来作为生产者和消费者之间的缓冲区。例如,我们...

    模拟“生产者-消费者”解决过程及方法

    生产者-消费者问题可以关联到软件设计模式中的"生产者-消费者模式"和"阻塞队列模式"。这些模式在多线程编程中广泛应用于处理异步任务和数据流。 6. **优化策略**: - **批量生产/消费**:生产者一次性生产多个...

    生产者-消费者.zip

    生产者-消费者模式的核心思想是共享资源(通常是一个缓冲区)的分离,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行消费。这种模式利用了线程间的协作,实现了数据的生产和消费的解耦,并避免了...

    生产者-消费者多线程处理

    在Java中,可以使用`BlockingQueue`接口来实现生产者-消费者模式,它已经内置了线程安全的队列操作。生产者可以使用`offer()`方法添加元素,消费者则用`take()`方法取出元素,这两个方法会自动处理等待和唤醒操作。 ...

    使用Qt信号量实现单生产者多消费者模型

    在多线程编程中,设计模式是解决特定问题的有效手段,其中之一便是生产者-消费者模型。这个模型描述了两个或多个线程之间的协作,其中一方(生产者)生成数据,另一方(消费者)消费这些数据。在Qt框架下,我们可以...

    C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

    本文将深入探讨C++中的多线程通信方式,并结合经典的生产者-消费者模式来阐述其实现。 一、C++多线程基础 C++11引入了标准库`&lt;thread&gt;`,提供了对多线程的支持。创建线程的基本方法是通过`std::thread`类,如下所示...

    JAVA_生产者-消费者

    4. **适用场景**:生产者-消费者模式广泛应用于多线程系统,如数据库连接池、消息队列、任务调度等。在这些场景中,生产者通常代表数据的生成或任务的提交,而消费者则负责处理这些数据或执行任务。 总结来说,...

    多进程同步-生产者消费者模式-C实现

    在这个场景下,我们关注的是一个经典的并发编程模型——生产者消费者模式。该模式是多进程同步的一种典型应用,通过它我们可以高效地管理数据的生产和消费。 生产者消费者模式基于操作系统提供的信号量(Semaphore...

    linux多进程生产消费

    在Linux操作系统中,多进程生产者-消费者模型是一种常见的并发编程模式,用于处理多个进程间的协同工作,特别是在数据处理和I/O操作中。这个模型基于一个核心概念:生产者进程生成数据,而消费者进程消耗这些数据。...

    java多线程实现生产者和消费者

    通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者模式,解决并发编程中的数据共享和协作问题。在实际项目中,这个模式常用于优化系统性能,尤其是在I/O密集型或计算密集型的应用中。

    Python 程序语言设计模式思路-并发模式:消费者模式:协调生产者和消费者之间的数据交换

    生产者-消费者模式作为一种强大的设计模式,通过缓冲区协调生产者和消费者之间的数据交换,提高了系统的...通过合适的设计和实现,可以使生产者-消费者模式在Python应用中发挥重要作用,提高系统的响应速度和可维护性。

    用多线程同步方法解决生产者-消费者问题(操作系统课设)

    ### 生产者-消费者问题详解 #### 一、问题背景与意义 生产者-消费者问题,作为操作系统领域经典的同步问题之一,广泛应用于多线程环境下资源共享的场景。它描述了一个或多个人(生产者)向一个有限容量的缓冲区中...

    生产者-消费者在Android开发中的应用

    生产者-消费者模型是计算机科学中的一个经典设计模式,它主要解决的是多线程环境下的资源协调问题。在Android开发中,这个模型被广泛应用来优化性能,提高用户体验,尤其是在处理数据加载、图片加载等异步任务时。...

    labview 生产者消费者例子

    7. **例程分析**:在提供的"生产者消费者"例程中,可能包含了创建生产者和消费者线程、初始化队列、添加数据到队列、从队列中取出数据、以及使用同步机制保证正确性的代码片段。通过对这些例程的分析和运行,可以...

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

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

    并发控制-生产者-消费者问题实验报告

    2. **多消费者模式**:设计中需考虑到单一生产者产生的消息可能需要被K个消费者消费(K≤M)。同时,某些消费者可能会消费来自多个生产者的消息。 3. **生命周期管理**:每个生产进程在其生产完M个消息之后结束...

    生产者 消费者 模式 c++

    在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等工具。 生产者消费者模式的基本思想是将数据的生产与消费分离,生产者负责创建数据,而消费者负责处理这些...

    多线程简易实现生产者消费者模式

    在提供的文件"stack"中,可能包含了一个使用栈作为缓冲区的生产者消费者模式实现。栈具有后进先出(LIFO)的特性,适合作为简单的缓冲区。具体实现可能包括了`Stack`类,用于表示栈,并包含了生产和消费的方法,以及...

    C++实现生产者-消费者高效异步日志系统源码

    在IT领域,尤其是在系统开发和性能优化中,生产者-消费者模型是一种常见的多线程设计模式,用于协调并发处理过程中的数据生成与消耗。在这个场景下,"C++实现生产者-消费者高效异步日志系统源码"的标题表明我们将...

Global site tag (gtag.js) - Google Analytics