生产者和消费者问题描述:
仓库初始值为0, 生产者首先生产产品,生产产品后将产品放入仓库,仓库中产品数量变为1, 此时生产者不在生产产品,直到消费者进入仓库消费掉产品后,将仓库产品数量变为0,生产者才继续进行生产。
生产者和消费者问题分析:
仓库是生产者和消费者的公共资源,那么生产者和消费者可以分别看做是一个线程,有着共享资源。生产者和消费者共同访问仓库,但是仓库在同一时间只允许有一人进入,此时就需要设置一把同步锁,同步锁控制着仓库,在同一时间只允许有一个人进入仓库,要么生产者,要么消费者。
/*
* 定义生产者线程,继承Runnable方法
*/
public class Consumer implements Runnable{
//定义公共资源——仓库
private Product pro;
//构造 方法传入仓库对象
public Consumer(Product pro) {
this.pro = pro;
}
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费者抢到仓库!");
pro.consume();
}
}
}
/*
* 定义消费者线程,继承Runnable方法
*/
public class Producer implements Runnable {
//定义公共资源——仓库
private Product pro;
//构造 方法传入仓库对象
public Producer(Product pro) {
this.pro = pro;
}
@Override
public void run() {
while(true){
System.out.println("生产者强到仓库!");
pro.produce();
}
}
}
/*仓库*/
public class Product {
//产品数量
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
// 消费产品
public synchronized void consume() {
//仓库产品不为零则消费
if(getNum()!=0){
System.out.println("消费产品!");
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
//消费后将仓库产品数置为零
setNum(0);
//唤醒生产者生产
notify();
}
}
//生产产品
public synchronized void produce() {
//仓库产品数目为零则进行生产
if(getNum()==0){
System.out.println("生产产品!");
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
//生产后将产品数目置为1
setNum(1);
//生产结束后,生产者进入等待状态,直到被消费者唤醒
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//测试类
public class TestThread {
public static void main(String[] args) {
Product pro = new Product();
//创建生产者线程
Thread producer = new Thread(new Producer(pro));
//创建消费者线程
Thread consumer = new Thread(new Consumer(pro));
//启动生产者线程
producer.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//0.5s后启动消费者线程
consumer.start();
}
}