package com.cn.tongxun;
/**
* 线程间的通信问题:
* 消费者和生产者:
* 生产者生产水果,如果水果没有被买走那么就不生产,处于等待状态,如果水果被消费者
* 买走的时候,消费者会通知生产者告诉他我们已经把水果买走了,请生产;消费者同理,如果
* 水果已经生产出来那么就买走,买走之后在通知生产者水果已经没有了请生产。
* 注意:①线程间的通信共享数据一定要有同步代码快synchronized
* ②一定要有wait和notify,而且两者一定成对出现
* ③生产者和消费者的线程实现一定是在while(true)【死循环】里面
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
Frult f = new Frult();
f.setName("苹果");
f.setExsit(false);
ProductFruit pt = new ProductFruit(f);
BuyFruit bt = new BuyFruit(f);
Thread t1 = new Thread(pt);
Thread t2 = new Thread(bt);
t1.start();
t2.start();
}
}
package com.cn.tongxun;
/**
* 水果类
* @author Administrator
*
*/
public class Frult {
private String name;
private boolean isExsit;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isExsit() {
return isExsit;
}
public void setExsit(boolean isExsit) {
this.isExsit = isExsit;
}
}
package com.cn.tongxun;
/**
* 生产者
* @author Administrator
*
*/
public class ProductFruit implements Runnable{
private Frult fruit;
public ProductFruit(Frult fruit) {
super();
this.fruit = fruit;
}
@Override
public void run() {
while(true){
//有共享的数据,多个线程作共享的数据,必须使用锁
synchronized(fruit){
//如果水果已经存在,那么生产者就不生成水果,等待着消费者买走再生成
if( fruit.isExsit()){
try {
//当前生成水果的线程被挂起,变成阻塞状态
fruit.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(fruit.getName()+"水果被生产出来");
//把水果的状态变成存在
fruit.setExsit(true);
//唤醒等待卖水果的线程
fruit.notify();
}
}
}
}
package com.cn.tongxun;
/**
* 消费者
* @author Administrator
*
*/
public class BuyFruit implements Runnable{
private Frult fruit;
public BuyFruit(Frult fruit) {
super();
this.fruit = fruit;
}
@Override
public void run() {
while(true){
//有共享的数据,多个线程作共享的数据,必须使用锁
synchronized(fruit){
if(!fruit.isExsit()){
try {
//当前生成水果的线程被挂起,变成阻塞状态
fruit.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(fruit.getName()+"水果被买走");
fruit.setExsit(false);
//唤醒生产者线程
fruit.notify();
}
}
}
}