Repository
重点在于Repertory类的实现,该类提供阻塞的addProduct和getProduct,来达到生产者与消费者之间的协调。
public class Repertory {
private int product = 0;
public synchronized void addProduct() {
if(this.product >= 5) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else {
product++;
System.out.println("Producer produce the " + product + "production");
this.notifyAll();
}
}
public synchronized void getProduct() {
if(this.product <= 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else {
System.out.println("Consumer takes the " + product + "production");
product--;
this.notifyAll();
}
}
}
Producer和Consumer
拥有Repository的一个实例。不需要考虑同步的问题。
public class Producer implements Runnable {
private Repertory repertory;
public Producer(Repertory repertory) {
this.repertory = repertory;
}
public void run() {
System.out.println("Producer begins to produce");
while(true) {
try {
Thread.sleep((int) (Math.random() * 10) * 100);
} catch (InterruptedException e) {
e.printStackTrace();
}
repertory.addProduct();
}
}
}
public class Consumer implements Runnable {
private Repertory repertory;
public Consumer(Repertory repertory) {
this.repertory = repertory;
}
public void run() {
System.out.println("Consumer begin to take");
while(true) {
try {
Thread.sleep((int) (Math.random() * 10) * 100);
} catch(InterruptedException e) {
e.printStackTrace();
}
repertory.getProduct();
}
}
}
ProductTest
产生两个线程用于生产者和消费者。
public class ProductTest {
public static void main(String[] args) {
Repertory repertory = new Repertory();
new Thread(new Producer(repertory)).start();
new Thread(new Consumer(repertory)).start();
}
}
分享到:
相关推荐
假设M个生产者和N个消费者共享一个具有K(K大于1)个缓冲区的循环缓冲结构BUFFER(提示:可以用一个循环...当无满缓冲区时消费者线程阻塞,并且多个生产者线程对IN的使用必须互斥,多个消费者线程对OUT的使用也必须互斥
设计在同一个进程地址空间内执行的多个线程。生产者线程和消费者线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供...消费者线程消费物品时,若无满的缓冲区,消费者线程将被阻塞,直到新的物品被生产出来。
本实验要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。...消费者线程消费物品时,若缓冲区为空,消费者线程将被阻塞,直到新的物品被生产出来。
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。...当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。...当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。...当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
本实验要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个确定的数值,例如N=32)。需要使用如下信号量: a)一个互斥信号量,用以阻止生产者线程和消费者线程...
生产者—消费者:在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空...
当缓冲区满时,“生产者”必须阻塞,等待“消费者”取走缓冲区数据后将其唤醒。当缓冲区空时,“消费者”阻塞,等待“生产者”生产了产品后将其唤醒。试用信号量实现“生产者”与“消费者”线程之间的同步。
当缓冲区满时生产者阻塞并且当缓冲区有空时生产者又重新工作。类似的,消费者当缓冲区空时阻塞并且当缓冲区有产品时又重新工作。显然,生产者和消费者需要一种同步机制以协调它们的工作。 二、系统功能 本程序模拟...
操作系统实践大作业:使用POSIX条件变量和互斥锁实现生产者、消费者同步问题,缓冲区空时消费者不能消费,当有生产者生产产品后唤醒阻塞的消费者;缓冲区满时生产者不能生产,当有消费者消费产品后唤醒阻塞的生产者...
waitempty( )--- 如果缓冲区满,该进程进入生产者等待队列;linkqueue(exe,&producertail); // 把就绪队列里的进程放入生产者队列的尾部 void signalempty() bool waitfull() void signalfull() void ...
根据输入的M、N和K的值,并假定M个生产者和N个消费者同时存在,每个生产者和消费者设置一个延迟时间属性,生产者线程和消费者线程的调度顺序根据延迟后时间按照先来先服务算法调度执行,要求设计并展示M个生产者和N...
程序使用共享内存的方法实现缓冲区,利用PV操作与信号量的方法实现生产者与消费者的同步。程序利用了三个信号量:mutex用于互斥地访问缓冲区;full用于判断缓冲区是否为满,用于指示消费者线程能否从缓冲区中取出...
而通过阻塞队列来进行通讯,所以生产者生产完数据之后不 用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队 列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。...
以生产者消费者模型为基础,在Windows环境下创建一个控制台进程,在该进程中创建读者写者线程模拟生产者和消费者。写者线程写入数据,然后将数据放置在一个空缓冲区中供读者线程读取。读者线程从缓冲区中获得数据,...
操作系统课程设计有限缓冲区问题的实现 本程序实现有限缓冲区问题。设计了两个线程,在一个地址空间运行,一个生产者线程producer生产产品,并把每个产品...如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。
操作系统中进程同步的问题,生产者-消费者模型的代码 在同一个进程地址空间内执行的两个线程。生产者线程生产物品, 然后将物品放置在一个空缓冲... 满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出 来。
waitempty( )--- 如果缓冲区满,该进程进入生产者等待队列;linkqueue(exe,&producertail); // 把就绪队列里的进程放入生产者队列的尾部 void signalempty() bool waitfull() void signalfull() void ...
产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。...当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。