* 线程通讯:当一个线程 完成了一个任务的时候,
* 要通知另外一个线程取处理其他的事情
*
* 生产者和消费者模型
*
* 问题1:价格错乱 (线程安全问题)
* 问题2:生产一个,消费一个
*
* 线程通讯的一些方法:
* wait():让当前线程进入等待状态
* notify():唤醒等待状态下的线程
*
* 母鸡下蛋,黄鼠狼偷蛋
*
* 生产者--母鸡
* 消费者--黄鼠狼
*
* 母鸡下一个蛋,通知黄鼠狼偷一个蛋
* 黄鼠狼偷完一个蛋,再通知母鸡下蛋
//产品类
class Product {
String name;
int price;
boolean flag; // 产品是否生产完毕的标志
}
// 生产者类
class Producer extends Thread {
// 维护一个产品成员
Product p;
public Producer(Product p) {
this.p = p;
}
@Override
public void run() {
int i = 0;
while (true) {
// 加同步锁
synchronized (p) {
if (p.flag == false) {
// 说明没有生产产品,就开始生产
if (i % 2 == 0) {
p.name = "摩托车";
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
p.price = 3000;
} else {
p.name = "自行车";
p.price = 400;
}
i++;
System.out.println("生产了" + p.name + ",价格 " + p.price);
// 生产完毕--改变标识
p.flag = true;
// 通知消费者 消费
p.notify();
} else {
// 产品已经生产完毕,但是消费者还没有消费,应该等待消费者先消费
try {
p.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
// 消费者类
class Customer extends Thread {
// 维护一个产品成员
Product p;
public Customer(Product p) {
this.p = p;
}
@Override
public void run() {
while (true) {
synchronized (p) {
if (p.flag == true) {
// 消费者消费
System.out.println("消费者消费了" + p.name + ",价格 " + p.price);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//产品已经被消费完毕,改变产品标识
p.flag = false;
//产品已经被消费完毕,通知生产者生产
p.notify();
}else{
//产品还没有生产好,等待生产者生产
try {
p.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
public class Demo10 {
public static void main(String[] args) {
Product p = new Product();
// 创建生产者线程
Producer producer = new Producer(p);
// 创建消费者线程
Customer customer = new Customer(p);
// 开启两个线程,边生产边消费
producer.start();
customer.start();
}
}