JavaSE学习笔记:多进程同步经典题目:生产者与消费者关系
前言
自己手写了一遍生产者与消费者经典题目:
- 加深了对多进程同步的理解
- 将生产产品和消费产品这一功能行为给予了生产者和消费者本身,使得代码表达更贴近现实。
一、代码如下
/**
* 生产者和消费者问题
*
* @author Calculus
* @create 2022-04-09 22:13
*/
public class test {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Productor productor = new Productor(clerk);
Consumer consumer = new Consumer(clerk);
Thread t1 = new Thread(productor);
Thread t2 = new Thread(consumer);
Thread t3 = new Thread(consumer);
t1.setName("生产者");
t2.setName("消费者1");
t3.setName("消费者2");
t1.start();
t2.start();
t3.start();
}
}
class Clerk {
private int goodNum;
public Clerk() {
this.goodNum = 0;
}
public void setGoodNum(int num) {
this.goodNum = num;
}
public int getGoodNum() {
return this.goodNum;
}
}
class Productor implements Runnable {
Clerk clerk;
public Productor(Clerk clerk) {
this.clerk = clerk;
}
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (clerk) {
if (clerk.getGoodNum() >= 20) {
try {
clerk.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
clerk.setGoodNum(clerk.getGoodNum() + 1);
System.out.println(Thread.currentThread().getName() + " 生产第 " + clerk.getGoodNum() + " 个产品 ");
clerk.notify();
}
}
}
}
class Consumer implements Runnable {
Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk = clerk;
}
public void run() {
while (true) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (clerk) {
if (clerk.getGoodNum() <= 0) {
try {
clerk.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " 消费第 " + clerk.getGoodNum() + " 个产品 ");
clerk.setGoodNum(clerk.getGoodNum() - 1);
clerk.notify();
}
}
}
}
本文通过一个Java实现的生产者-消费者问题,深入探讨多进程同步的概念。作者创建了Productor(生产者)和Consumer(消费者)类,并使用Clerk(仓库管理员)类来管理产品数量。生产者在产品达到20个时等待,消费者在没有产品时等待,实现了资源的合理分配和协调。代码展示了wait()和notify()方法的应用,以确保生产与消费的同步进行。

348

被折叠的 条评论
为什么被折叠?



