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();
}
}
}
}