package com.synchronze;
public class Store {
private final int MAX_SIZE;
private int count;
public Store(int n) {
MAX_SIZE = n;
count = 0;
}
public synchronized void add() {
while (count >= MAX_SIZE) {
System.out.println("已经满了");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
System.out.println(Thread.currentThread().toString() + "put" + count);
this.notifyAll();
}
public synchronized void remove() {
while (count <= 0) {
System.out.println("已经空了");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().toString() + "get" + count);
count--;
this.notifyAll();
}
public static void main(String[] args) {
Store s = new Store(5);
Thread pro = new Producer(s);
Thread con = new Consumer(s);
Thread pro2 = new Producer(s);
Thread con2 = new Consumer(s);
pro.setName("producer");
con.setName("consumer");
pro.setName("producer2");
con.setName("consumer2");
pro.start();
pro2.start();
con.start();
con2.start();
}
}
class Producer extends Thread {
private Store s;
public Producer(Store s) {
this.s = s;
}
public void run() {
while (true) {
s.add();
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class Consumer extends Thread {
private Store s;
public Consumer(Store s) {
this.s = s;
}
public void run() {
while (true) {
s.remove();
try {
Thread.sleep(1200);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
在所有的Java根类java.langObject中,包含了三个重载的wait()方法以及notify()和natifyall()方法。他们主要的作用在于让当前的线程进入等待池或从等待池中唤醒一个或多个线程继续执行。正是通过他们,才能很好的解决生产者消费者模型的问题。以上实例,由于生产者线程执行更快,因此程序会间歇性的打印类似以下结果:
Thread[producer2,5,main]put1
Thread[Thread-2,5,main]put2
Thread[consumer2,5,main]get2
Thread[Thread-3,5,main]get1
Thread[producer2,5,main]put1
Thread[Thread-2,5,main]put2
Thread[Thread-3,5,main]get2
Thread[consumer2,5,main]get1
Thread[Thread-2,5,main]put1
Thread[producer2,5,main]put2
Thread[consumer2,5,main]get2
Thread[Thread-3,5,main]get1
Thread[Thread-2,5,main]put1
Thread[producer2,5,main]put2
Thread[producer2,5,main]put3
Thread[Thread-2,5,main]put4
Thread[consumer2,5,main]get4
Thread[Thread-3,5,main]get3
Thread[Thread-2,5,main]put3
Thread[producer2,5,main]put4
Thread[Thread-3,5,main]get4
Thread[consumer2,5,main]get3
Thread[Thread-2,5,main]put3
Thread[producer2,5,main]put4
Thread[producer2,5,main]put5
已经满了
Thread[Thread-3,5,main]get5
Thread[Thread-2,5,main]put5
Thread[consumer2,5,main]get5
Thread[producer2,5,main]put5
已经满了
Thread[Thread-3,5,main]get5
Thread[Thread-2,5,main]put5
Thread[consumer2,5,main]get5
Thread[producer2,5,main]put5
已经满了
已经满了
…………………………
同理,如果消费者线程执行更快,则会打印多个“已经空了”
分享到:
相关推荐
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
生产者消费者线程问题是多线程编程中的一个经典模型,主要用来解决资源的同步与协作问题。在操作系统课程设计中,这个模型常被用来教授线程间的通信与同步机制,帮助学生理解进程间的协调和资源管理。以下是关于生产...
在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...
生产者消费者流程图; 生产者消费者流程图。
生产者-消费者问题是并发编程中的一个经典模型,它描述了两个或多个线程之间的协作,其中一个或多个线程(生产者)负责生成数据,而其他线程(消费者)则负责处理这些数据。在实际应用中,这可以对应于例如数据生成...
本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
8. **死锁和饥饿**:在实现多线程生产者消费者模型时,必须警惕可能出现的死锁和饥饿问题。死锁是两个或更多线程相互等待对方释放资源导致的僵局,而饥饿则是指某一线程因为资源分配不公平而无法获得执行的机会。...
生产者消费者问题是计算机科学中的一种经典问题,描述的是在多线程环境中,多个生产者线程和消费者线程之间的协作问题。生产者线程负责生产数据,并将其存储在缓冲区中,而消费者线程则从缓冲区中取出数据并进行处理...
在多线程环境中,生产者消费者模型和读者写者问题是经典的并发控制问题,它们都涉及到资源共享与同步。本主题将深入探讨如何使用编程来解决这两个问题。 首先,生产者消费者问题是多线程并发控制中的一个经典例子。...
使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...
以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 ...
生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的并发访问问题。在C#中,我们可以利用System.Threading命名空间提供的工具来实现这一模型。下面将详细阐述这个问题的背景、...
在计算机科学中,生产者-消费者问题是多线程编程中的一个经典问题,它涉及到了并发控制和资源管理。然而,给定的标题“利用单线程完成的生产者与消费者程序”表明,这个程序是在单线程环境中实现的,这意味着没有...
生产者-消费者问题是多线程同步的一个经典案例,主要探讨如何在并发环境下,确保生产者进程和消费者进程之间正确地共享资源,避免数据竞争和死锁。在这个问题中,生产者进程负责创建产品并将产品放入缓冲区,而消费...
生产者-消费者问题是在有界缓冲上操作的,它利用 N 个字节的共享内存作为有界循环缓冲区,生产者线程不断顺序地将 0 到 100 的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。...
生产者消费者问题是计算机科学中的一个经典问题,主要用于描述并发环境下多个线程之间如何共享有限资源的问题。在这个问题中,“生产者”负责生成数据并将其放入公共缓冲区中,“消费者”则负责从缓冲区取出数据进行...
生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过共享资源在并发环境中实现线程间的协调。在这个问题中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。MFC(Microsoft Foundation ...
设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符.(2)生产者和消费者各有两个以上.(3)多个生产者或多个消费者之间须有共享对缓冲区...
绝对好用!福利到了,一分就送 部分代码Console.WriteLine("Please enter how many proceducer:");...生产者,消费者,缓冲池,执行次数都可以自定义个数。。整个程序体现了线程的同步与互斥。。。