import java.util.Calendar;
/**
* 生产者和消费者
* 生产者(Producer) 店员(Clerk) 消费者(Customer)
* 产品固定
* 两个线程
* 共享数据解决线程安全
*/
public class ProducTest {
public static void main(String[] args){
//创建一个店员对象
Clerk clerk =new Clerk();
//创建一个生产者
Producer p1 = new Producer(clerk);
p1.setName("生产者1");
//开启线程
p1.start();
//创建一个消费者并开启线程
//new Thread(new Consumer(clerk)).start();
new Consumer(clerk).start();
}
}
//店员
class Clerk{
private int productCount=0;
//生产产品的方法
public synchronized void produceProduct() {
if (productCount<20){
productCount ++;
System.out.println(Thread.currentThread().getName()+"开始生产"+productCount);
notifyAll();
}else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//消费产品的方法
public synchronized void consumeProduct() {
if (productCount > 0){
System.out.println(Thread.currentThread().getName()+"开始消费"+productCount);
productCount--;
notifyAll();
}else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//生产者
class Producer extends Thread{
//class Producer
//声明共用店员
private Clerk clerk;
//调用
public Producer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"开始消费产品");
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//店员生产产品
clerk.produceProduct();
}
}
}
//消费者
class Consumer extends Thread{
//声明共用店员
private Clerk clerk;
//调用
public Consumer (Clerk clerk){
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"开始生产产品");
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//消费产品
clerk.consumeProduct();
}
}
}
多线程经典案例生产者和消费者
最新推荐文章于 2021-11-22 13:10:55 发布
本文介绍了使用Java实现的生产者消费者模型,通过Clerk、Producer和Consumer类展示如何在共享资源中确保线程安全,使用synchronized关键字和wait/notify机制来协调并发操作。
摘要由CSDN通过智能技术生成