`

简单又经典的生产者消费者线程模式

 
阅读更多

 

 

/**

建立桌子,并启动代表厨师、客人的线程。传进MakerThread与EaterThread构造器的随机数种子

*/

public class Main{

 

public static void main(String[] args){

Table table=new Table(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-1",table,62643).start();

new EaterThread("EaterThread-1",table,38327).start();

}

}

 

 

 

/**

厨师,制作蛋糕的类

*/

 

import java.util.Random;

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){

e.printStackTrace();

}

}

private static synchronized int nextId(){

return id++;

}

}



/**
客人,吃蛋糕的类
*/

import java.util.Random;

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)
{
e.printStackTrace();
}
}
}

/**
放蛋糕的桌子
**/

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()+" take "+cake );
return cake;
}
}




这个Pattern中,有着建立Data参与者的线程(Producter参与者)与使用Data参与者得线程(Consumer参与者)在运行。两者之间安插了Channel参与者(Table)。并委托channel参与者来保管想要传递的Data参与者。Channel参与者的工作可说是Data参与者得中继站、桥梁及沟通管道。因为可能会有多个线程使用到Channel参与者,所以Channel参与者中必须进行共享互斥。这样的设计使线程之间可以安全的沟通。若Channel参与者可囤积Data参与者得空间足够,可作为Producer参与者与Consumer参与者处理速度的缓冲。
分享到:
评论

相关推荐

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

    生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...

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

    创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue&lt;String&gt; queue; public Producer(BlockingQueue&lt;String&gt; queue) { this....

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

    生产者和消费者线程都需要有自己的业务逻辑,这可以通过重写`run()`方法实现。 2. **共享资源**:在生产者-消费者模型中,通常会有一个固定大小的缓冲区作为共享资源。可以使用数组或链表实现,但需要注意的是,当...

    c#多线程之生产者消费者

    "生产者消费者"模式是多线程应用中一个经典的范例,它通过线程间的协作来实现数据处理的高效与同步。这个模式的核心思想是将任务分为两个角色:生产者(Producer)和消费者(Consumer)。生产者负责生成数据,而消费...

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

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

    Linux 多线程实现生产者消费者模式.pdf

    Linux多线程实现生产者消费者模式涉及到操作系统中的多个重要知识点,包括多线程编程、生产者消费者模型、互斥量、条件变量等。在Linux环境下,这些功能可以通过POSIX线程(pthread)库来实现。下面详细解释这些知识...

    生产者 消费者 模式 c++

    生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等...

    多线程生产者消费者模式

    生产者消费者模式是一种经典的多线程设计模式,它用于协调两个或多个线程之间的数据交换,确保数据的正确生产和消费。 生产者消费者模式的核心思想是通过共享缓冲区来实现线程间的通信。生产者线程负责生成数据并放...

    生产者消费者 多线程

    在计算机科学中,"生产者消费者"模型是一种经典的多线程设计模式,它涉及到线程间的协作以实现高效的数据处理。这个模型的核心是通过共享内存(通常是一个缓冲区)来同步生产者和消费者的活动,避免资源的竞争和浪费...

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

    生产者和消费者线程通过条件变量等待特定事件的发生,例如缓冲区状态的变化。 在实际应用中,生产者-消费者模型可以被扩展到多个生产者和多个消费者,且缓冲区大小可以动态调整。此外,为了防止死锁和饥饿现象,还...

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

    Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...

    生产者消费者多线程代码

    在Java或C++等编程语言中,我们可以利用多线程来实现“生产者消费者”模式,这是一个经典的并发问题。这个模式涉及到两个主要角色:生产者(Producer)和消费者(Consumer),它们共享一个有限大小的缓冲区作为临界...

    多线程实现生产者消费者

    1. **生产者消费者模型**:这是一种设计模式,用于协调两个并发执行的线程,一个负责生成数据(生产者),另一个负责处理数据(消费者)。这种模式可以避免因生产速度过快或消费速度过慢导致的数据溢出或等待问题。 ...

    利用单线程完成的生产者与消费者程序

    在计算机科学中,生产者-消费者问题是多线程编程中的一个经典问题,它涉及到了并发控制和资源管理。然而,给定的标题“利用单线程完成的生产者与消费者程序”表明,这个程序是在单线程环境中实现的,这意味着没有...

    QT/C++多线程练习:单生产者多消费者(源码)

    消费者管理类:根据UI的控制去创建消费者线程以及删除/停止消费者线程,需要一个容器将已存在的消费者线程指针存储起来,并且可以通过容器内的指针去控制消费者线程。 消费者线程职责:减少商品数量,其他的都不管,...

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

    java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...

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

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

    多线程_生产者与消费者模式示例

    线程池可以配合生产者消费者模式,例如通过提交任务到线程池来实现生产者,线程池中的工作线程充当消费者角色。 在使用生产者消费者模式时,需要注意以下几点: - **线程安全**:确保所有的操作都是线程安全的,...

    Qt C++11 生产者消费者模式类

    生产者消费者模式是一种多线程同步的经典设计模式,它在多线程编程中扮演着重要的角色,用于协调生产数据和消费数据的两个并发过程。在本项目“Qt C++11 生产者消费者模式类”中,我们看到利用Qt框架和C++11的新特性...

Global site tag (gtag.js) - Google Analytics