import java.util.ArrayList;
import java.util.List;
/**
* @author 宁
*生产者消费者问题:生产者生产的东西不能超出规定的最大生产量,
*超过最大生产量时将暂停生产,等待消费者消费。
*消费者当购买生产者的东西时,当购买的东西库存达到0时会停止购买,等待生产者生产。
*二者是一种动态平衡状态,也就是说生产者在生产期间消费者有消费并且没有达到最大生产量就可以一直生产,
*并不是生产者要生产到最大产量才允许消费者开始消费。
*/
public class Xiancheng {
public static void main(String[] args) {
List list = new ArrayList();
// 两个线程公用一个表对象
Thread t1 = new Thread(new Shengchan(list));
Thread t2 = new Thread(new Xiaofei(list));
t1.start();
t2.start();
}
}
//假如生产者最多只能生产一个物品超过一个将停止生产等待消费者消费来模拟一下这个问题(可以生产多个)
class Shengchan implements Runnable {
List list;
public Shengchan(List list) {
super();
this.list = list;
}
@Override
public void run() {
int i = 0;
// 对于生产者消费者进行100次观察其效果
while (i < 100) {
// 生产者占用锁
synchronized (list) {
// 此时表示生产者已经生产了一个产品了
if (list.size() > 0) {
try {
// Thread.sleep(1000);
// 释放锁,进行等待
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 执行到这一步表示list.size() = 0,此时生产者要进行生产了
Object obj = new Object();
list.add(obj);
System.out.println("生产者生产" + obj + "第" + i + "次");
// 唤醒所有等待
list.notifyAll();
}
i++;
}
}
}
class Xiaofei implements Runnable {
List list;
public Xiaofei(List list) {
super();
this.list = list;
}
@Override
public void run() {
int i = 0;
while (i < 100) {
// 消费者占用锁
synchronized (list) {
if (list.size() == 0) {
try {
// 表示消费者已经消费完了释放锁进行等待
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 没有进入if语句表明list.size() != 0 消费者可以消费
// 对表内的元素进行删除返回的是删除的元素
Object obj = list.remove(0);
System.out.println("消费者消费" + obj + "第" + i + "次");
// 唤醒所有等待
list.notifyAll();
}
// 进行技术
i++;
}
}
}
java多线程 实现生产者和消费者问题
最新推荐文章于 2026-04-20 23:25:35 发布
1649

被折叠的 条评论
为什么被折叠?



