`
pan_java
  • 浏览: 287913 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

多线程设计模式 -- ProducerConsumer

阅读更多
放蛋糕的桌子
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();//当蛋糕数为0时,等待
        }
        String cake = buffer[head];
        head = (head + 1) % buffer.length;
        count--;
        notifyAll();//唤醒等待线程
        System.out.println(Thread.currentThread().getName() + " takes " + cake);
        return cake;
    }
}


吃线程
public class EaterThread 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) {
        }
    }
}


做线程
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;
        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 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();
    }
}
分享到:
评论

相关推荐

    java多线程设计模式详解(PDF及源码)

    书中包含Java线程的介绍导读、12个重要的线程设计模式和全书总结以及丰富的附录内容。第一章相关线程设计模式的介绍,都举一反三使读者学习更有效。最后附上练习问题,让读者可以温故而知新,能快速地吸收书中的...

    java多线程设计模式源码

    7. **生产者消费者模型(ProducerConsumer)**:这是一种经典的多线程设计模式,通过使用阻塞队列,生产者线程将数据放入队列,而消费者线程从队列中取出数据。Java并发库中的`BlockingQueue`接口是实现这一模式的...

    java多线程设计模式 (PDF中文版, 附源码)

    目录: 漫谈UML Introduction 1 Java语言的线程 Introduction 2 多线程...总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的优先级 附录D 线程相关的主要API 附录E 参考文献

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

    生产者-消费者模式是一种经典的多线程设计模式,用于解决数据共享问题,尤其是在一个线程生产数据而另一个线程消费数据的情况下。在这个模式中,生产者负责生成数据并放入共享的数据结构(如队列),而消费者则从这...

    java多线程设计模式详解

    在深入探讨Java多线程设计模式的知识点之前,让我们首先明确多线程编程在Java中的地位和作用。Java自诞生之日起就内置了对多线程编程的支持,这使得开发能够充分利用多核处理器性能的应用程序成为可能。多线程设计...

    java多线程设计模式

    Java多线程设计模式是Java编程中不可或缺的一部分,它涉及到如何在并发环境中高效、安全地组织代码执行。在Java中,多线程是通过Thread类或实现Runnable接口来创建和管理的。本教程将深入探讨多线程设计模式,帮助...

    Producer/Consumer 多线程处理文件

    在这个"Producer/Consumer 多线程处理文件"的主题中,我们将深入探讨Java中的生产者消费者模型,以及如何利用这一模式来高效地处理大量数据,如一秒钟处理一千多条记录。 生产者消费者模型源于操作系统理论,是解决...

    java多线程设计模式详解(PDF及源码).rar

    Java多线程设计模式是Java开发中不可或缺的一部分,它涉及到如何高效、安全地在多个执行线程之间共享资源和协调任务。在这个“java多线程设计模式详解(PDF及源码)”的压缩包中,你将找到深入的理论讲解以及实践示例...

    软件工程中的多线程编程实践.pptx

    ### 软件工程中的多线程编程实践 ...合理的多线程设计不仅可以显著提高程序的性能,还能增强程序的稳定性和响应能力。在未来的发展中,随着硬件技术的进步,多线程编程将成为更加重要的技术手段之一。

    java多线程_设计模式_各种技术(我的书架)

    例如,生产者消费者模型(Producer-Consumer Problem)可以利用`BlockingQueue`实现线程间的通信,而模板方法模式则可以指导如何在多线程环境中定义操作的框架,允许子类定制具体步骤。此外,单例模式在多线程环境中...

    详细剖析JAVA多线程案例教学

    Java多线程编程不仅可以显著提升程序的性能,还能让程序设计更加贴近现实世界的模型。然而,多线程编程也伴随着一系列挑战,如死锁、竞态条件等问题。因此,在实际开发中,开发者需要充分了解多线程的工作原理,并...

    典型的多线程--生产和消费

    "典型的多线程--生产和消费"这个主题,通常指的是生产者-消费者问题,这是一种经典的设计模式,用于解决如何在一个数据结构(如队列)中高效地存储和检索数据,同时避免生产者过于快速地生成数据而消费者无法及时...

    ProducerConsumer-CSharp:C# 制作的 ProducerConsumer Demo

    ProducerConsumer 模型是计算机科学中的一个经典设计模式,它主要解决了多线程环境下的资源同步和通信问题。在 C# 中,我们可以利用 .NET Framework 提供的并发和线程管理工具来实现这个模型。本项目 "Producer...

    java多线程.pdf

    线程设计模式包括Master-Worker模式、Producer-Consumer模式等,这些模式定义了多线程环境下任务执行和资源分配的标准方式。Master-Worker模式中,Master线程负责分配任务,Worker线程负责执行任务;Producer-...

    设计模式.pdf_学习模式必备

    在多线程环境中,确保数据的一致性和程序的正确性非常重要,因此多线程模式对于处理并发问题尤为重要。 - **Guarded Suspension**:保护性暂停模式,允许线程等待条件满足后再继续执行。 - **Producer-Consumer**:...

    Consumer-Producer.rar_Java Consumer_java 生产者 消费者_producer java_互

    5. **代码实现**:在`Consumer-Producer.rar`中的`Consumer-Producer`文件可能包含了具体的Java代码实现,它可能包括两个类——`Producer`和`Consumer`,分别代表生产者和消费者。每个类可能有一个无限循环来持续...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...

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

    在IT领域,多线程间通信是并发编程中的重要概念,尤其在服务器端应用和高并发系统中。本文将深入探讨“多生产者-多消费者”模式,这是一种经典的线程同步问题,旨在优化资源的利用和提高系统的效率。在这个模式中,...

    java多线程例子-生产者消费者

    这种模式是并发编程中的经典设计模式,用于协调生产数据和消费数据的两个不同线程。 生产者消费者模式的基本概念是有一个共享资源,即队列,在这里作为数据缓冲区。生产者线程负责将产品(数据)放入队列,而消费者...

Global site tag (gtag.js) - Google Analytics