Thread 线程经典示例之多生产者 多消费者
- 要求多个生产者进行生产 多个消费者进行消费
- 其间的生产和消费实现同步
- 如果库存超过20则生产等待消费继续
- 如果消费少于0则消费暂停生产继续
方法摘要
- wait();不想要此线程进行暂时等待
- notifyAll();通知此对象监视器上等待的所有线程
- Thread.sleep();线程进行休眠指定时间数
代码实现如下
此模块实现主线程中创建两个生产者对象 两个消费者线程对象
public static void main(String[] args) {
Clerk cl = new Clerk();
//创建两个生产者对象并将产品对象作为其构造参数传入供线程调用
Producer pro = new Producer(cl);
Producer pro1 = new Producer(cl);
//创建两个消费者对象并将产品对象作为其构造参数传入供线程调用
Consumer con = new Consumer(cl);
Consumer con1 = new Consumer(cl);
//创建两个生产者线程对象并就绪
new Thread(pro,"生产者甲 ").start();
new Thread(pro1,"生产者甲 ").start();
//创建两个消费者线程对象并就绪
new Thread(con,"消费者A ").start();
new Thread(con1,"消费者B ").start();
}
此代码快实现生产者线程
class Producer implements Runnable{
private Clerk clerk;
public Producer(Clerk clerk){
this.clerk=clerk;
}
@Override
public void run() {
while(true){
//调用已经实现了同步的生产方法
clerk.addProduct();
}
}
}
此代码快实现消费者线程
class Consumer implements Runnable{
private Clerk clerk;
public Consumer(Clerk clerk){
this.clerk=clerk;
}
@Override
public void run() {
while(true){
//调用已经实现了同步的消费方法
clerk.sellProduct();
}
}
}
此代码快实现产品类其中封装了同步的生产和消费方法
class Clerk{
int product = 0;//产品的库存量
/**
* 供生产者生成产品使用
*
* 每次调用此方法,相当于 生产者生产
*/
public synchronized void addProduct(){//默认锁对象 this(同步方法)
if (product>=20) {
//不需要继续生成,先等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
//可以生成
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"生成了1个产品,目前库存是:"+(++product));
notifyAll();//唤醒 所有此对象监视器上的等待线程
}
}
/**
* 供消费者消费产品使用
*
* 每次调用此方法,相当于 消费者消费
*
*/
public synchronized void sellProduct(){//默认锁对象 this (同步方法)
if (product<=0) {//目前没有库存,先等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"消费了1个产品,目前库存是:"+(--product));
notifyAll();//通知此对象监视器上等待的所有线程
}
}
}