假设有一个出库,生产者往出库放货物,消费者拿出货物
仓库满了不能生产,出库空了不能消耗
现在用集合表示出库,仓库最多存10个元素
public class 生产者消费者问题 {
public static void main(String[] args) {
List list = new ArrayList();
Thread t1 = new Thread(new Producer(list));
Thread t2 = new Thread(new Comsummer(list));
t1.setName("生产者线程");
t2.setName("消费者线程");
t1.start();
t2.start();
}
}
//生产线程
class Producer implements Runnable {
// 仓库
private List list;
public Producer(List list) {
this.list = list;
}
public void run() {
// 一直生产
while (true) {
synchronized (list) {
if (list.size() > 10) {
//仓库满了,不能生产,进入等待状态,并释放锁
try {
list.wait();//生产者线程进入等待状态,等待消费者消费
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//程序执行到这,说明仓库空,开始生产
Object object=new Object();
list.add(object);
System.out.println(Thread.currentThread().getName()+"--->"+object);
//唤醒消费者
list.notify();
try {
Thread.sleep(1000*1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
//消费线程
class Comsummer implements Runnable {
// 仓库
private List list;
public Comsummer(List list) {
this.list = list;
}
public void run() {
// 一直消费
synchronized (list) {
while (true) {
if (list.size() == 0) {
try {
list.wait();
} catch (Exception e) {
// TODO: handle exception
}
}
//程序执行到这,说明仓库不空,可以消费
Object object=list.remove(0);
System.out.println(Thread.currentThread().getName()+"--->"+object);
//唤醒生产者生产
list.notify();
try {
Thread.sleep(1000*1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}