线程通信经典例题-生产者和消费者问题
问题描述
java代码实现-注释进行详解
package com.myy.service;
/**线程通信经典例题:生产者和消费者
* @author myy
* @create 2020-09-05 17:04
*/
class Clerk{
int productnum=0;
//涉及到了线程同步,使用synchronized(下面生产产品原理同)
public synchronized void consumerProduct() {
if(productnum>0){
//有产品则可以消费
System.out.println(Thread.currentThread().getName()+":正在消费第"+productnum+"个产品");
productnum--;
//消费完则表示有空位,可以唤醒生产者线程
notify();
}
else{
try {
//假如没有产品,则进入阻塞
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//原理同上
public synchronized void productorProduct() {
if(productnum<20){
productnum++;
System.out.println(Thread.currentThread().getName()+":正在生产第"+productnum+"个产品");
notify();
}
else{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//使用继承Thread方式创建线程
class Productor extends Thread{
private Clerk clerk;
public Productor(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(getName()+":开始生产产品");
while(true){
//设置睡眠来表示生产速度
try {
sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.productorProduct();
}
}
}
//使用继承Thread方式创建线程
class Consumer extends Thread{
private Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(getName()+":开始消费产品");
while(true){
//设置睡眠来表示消费速度
try {
sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.consumerProduct();
}
}
}
public class ConsumerProductor {
public static void main(String[] args) {
//创建店员类
Clerk clerk=new Clerk();
//创建生产者和消费者线程
Productor productor=new Productor(clerk);
Consumer consumer1=new Consumer(clerk);
Consumer consumer2=new Consumer(clerk);
//分别给线程命名
productor.setName("生产者");
consumer1.setName("消费者1");
consumer2.setName("消费者2");
//启动线程
productor.start();
consumer1.start();
consumer2.start();
}
}