此模式案例是java多线程中比较具有代表性。具体要求:有生产者,消费者,还有商品。当商品数不为0时,消费者进行消费,每一次消费商品数量会减一。当商品为0的时候,生产者会进行生产,每次生产五件商品
分析:当商品不为0的时候:消费者线程进行消费,生产者线程不生产,此时生产者线程状态为wait。当商品为0的时候:消费者线程唤醒生产者,消费者将状态设置为wait。当生产者生产完毕后,生产者唤醒消费者,生产者将状态设置为wait,消费者又进行消费,以此循环。
package day20;
/**
* 商品类
* @author cyw
*
*/
public class Commodity {
//商品数量
public static int count = 5;
//无参构造
public Commodity() {
}
/**
* 消费商品
*/
public synchronized void consume() {
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//如果数量大于0则进行消费
if(count > 0) {
//消费是持续的,每次消费一个
for(int i = 1; i<=5; i++) {
count--;
System.out.println("消费者消费了一件商量,还剩"+count);
}
}else {
//否则提醒正在等待的生产者线程开始生产
notify();
//消费者进行等待
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* 生产商品
*/
public synchronized void make() {
while(true) {
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//如果商品数量小于等于0,那么进行生产
if(count <=0) {
//每次生产五个
count += 5;
System.out.println("生产者生产了五件商品");
//唤醒等待的消费者线程
notify();
}else {
//否则生产者线程进行等待
try {
System.out.println("生产者开始休息");
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
package day20;
/**
* 消费者类
* @author cyw
*
*/
public class Customer extends Thread{
//消费者需要商品属性
private Commodity commodity;
//无参构造
public Customer() {
}
//有参构造
public Customer(Commodity commodity) {
this.commodity = commodity;
}
/**
* 重新run方法
*/
@Override
public void run() {
commodity.consume();
}
}
package day20;
/**
* 生产者类
* @author cyw
*
*/
public class Producer extends Thread {
//生产者需要获取商品属性
private Commodity commodity;
//无参构造
public Producer() {
}
//有参构造
public Producer(Commodity commodity) {
this.commodity = commodity;
}
/**
* 重写run()方法
*/
@Override
public void run() {
commodity.make();
}
}
package day20;
public class Run {
public static void main(String[] args) {
//新建商品对象
Commodity commodity = new Commodity();
//实例化生产者线程对象
Thread customer = new Customer(commodity);
Thread producer = new Producer(commodity);
//开启线程
customer.start();
producer.start();
}
}