package com.jn.learning.javalearning.thread;
/**********************************************************************************************
* *
* Written by TankPush (Jn)
*
* Description:
* 生产消费者问题:线程间通信
* 生产者生产产品,消费者消费产品,
* 中间环节中店员负责二者间联系,当数量少于100个时,通知生产者生产,大于0个时,通知消费者消费
* 思考:如果实现多个线程消费,一个线程生产;或者多个线程生产,一个线程消费,该如何实现生产和消费间的均衡
* *
***********************************************************************************************/
public class ProduceConsumer {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Producer p = new Producer(clerk);
p.setName("生成者1");
Consumer c1 = new Consumer(clerk);
c1.setName("消費者1");
// Consumer c2 = new Consumer(clerk);
// c2.setName("消費者2");
p.start();
c1.start();
// c2.start();
}
}
class Producer extends Thread {
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(1000);
} 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.consumerProduct();
}
}
}
class Clerk {
private int num = 100;//给定产品个数的初始值
public synchronized void produceProduct() {
if (num < 100) {
num++;
System.out.println(Thread.currentThread().getName() + "生产第:" + num + "个产品");
this.notify();
}else{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void consumerProduct() {
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "消费第:" + num + "个产品");
num--;
this.notify();
}else{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
经典的生产消费者问题(多线程:线程间通信;静态代理)
最新推荐文章于 2024-06-09 15:14:23 发布