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的使用也必须互斥
本主题将深入探讨如何使用信号量这一同步工具来解决两个经典的问题:有限缓冲区的生产者-消费者问题以及读进程具有优先权的读者-写者问题。 首先,我们来看生产者-消费者问题。在这个问题中,有一个有限大小的缓冲...
- 通过一个共享缓冲区来协调生产者与消费者之间的交互。 - 展示同步与互斥机制如何在多线程环境下确保数据的一致性和完整性。 **具体实现思路:** 1. **初始化共享资源**: - 创建一个固定大小的缓冲区(本例中为 ...
当生产者或消费者想要访问缓冲区时,先执行`P(s1)`,如果缓冲区已满(`s1`小于0),生产者会被阻塞;同样,如果缓冲区为空,消费者也会被阻塞。 2. **同步**:确保生产者不会在缓冲区满时生产,消费者也不会在缓冲...
在计算机编程中,生产者消费者模型通常通过使用队列(Queue)数据结构来实现。队列是一种先进先出(FIFO)的数据结构,它提供了一种在生产者和消费者之间安全传递数据的方式。当生产者生成数据时,它会将数据放入...
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。 通过实验,...
本实验要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。...消费者线程消费物品时,若缓冲区为空,消费者线程将被阻塞,直到新的物品被生产出来。
两者之间通过一个缓冲区进行交互,这个缓冲区作为共享资源,需要进行适当的同步控制,以避免生产者过快填满缓冲区或者消费者过早地消耗完所有数据。 首先,我们需要一个容器作为缓冲区,通常选择队列(queue),...
- **g_hFullSemaphore**: 信号量,表示缓冲区中还有多少空闲位置可供生产者使用。 - **g_hEmptySemaphore**: 信号量,表示缓冲区中有多少已填充位置可供消费者使用。 - **g_continue**: 布尔变量,控制程序的运行...
在生产者-消费者问题中,可以设置信号量的值为缓冲区的大小,生产者在放数据前获取一个许可,如果缓冲区已满,则会阻塞等待;消费者在取数据后释放一个许可,这样可以确保缓冲区不会溢出。 3. **Condition**: Java...
在C++的生产者消费者问题解决方案中,通常会使用一个缓冲区来存储待消费的数据。这个缓冲区是共享资源,因此需要使用互斥量保护。生产者在缓冲区未满时才能生产数据并放入缓冲区,消费者在缓冲区非空时才能取出数据...
在生产者-消费者问题中,我们需要一个互斥信号量来保护缓冲区,确保同一时间只有一个进程(无论是生产者还是消费者)能够访问缓冲区。 2. **条件信号量**:用于实现进程间的同步。在这里,我们需要两个条件信号量,...
为了解决这个问题,我们需要确保生产者不会在缓冲区满时继续添加数据,消费者也不会在缓冲区为空时尝试消费数据,这就需要我们使用同步机制。 在Windows操作系统中,可以使用线程控制API函数来实现这种同步。以下是...
两者之间需要通过一个共享的数据缓冲区进行通信,同时需要保证在任何时候,缓冲区不会被填满或完全为空,以避免生产者过度生产或消费者无数据可消费的情况。 C++中实现生产者消费者模型通常涉及以下关键知识点: 1...
在Linux C环境中,有限缓冲区的生产者-消费者和读者-写者问题是多线程或进程间通信(IPC,Interprocess Communication)的经典示例。这些问题是并发编程中的核心概念,用于解决多个进程如何共享资源而不会产生数据...
互斥量确保了在同一时刻只有一个线程能访问缓冲区,而信号量则用于同步生产者和消费者的动作,避免“饥饿”或“阻塞”现象。 具体实现时,可以设置两个信号量:一个是缓冲区的容量,用于控制生产者的生产速率;另一...
为了防止生产者和消费者同时访问缓冲区,我们需要使用Mutex或lock关键字来实现。这样,当一个线程在访问缓冲区时,其他试图访问的线程会被阻塞,直到当前线程完成操作并释放锁。这确保了数据的一致性和完整性,避免...
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。...当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
如果生产者和消费者都在同一个进程中,可以使用临界区保护缓冲区,确保同一时间只有一个线程能够访问。 在本科阶段的项目中,可能使用的是其中的一种或多种机制的组合,来实现生产者消费者模型。由于可能存在小瑕疵...