理解多线程通信,就是要用多线程需要有一个共同的共享资源,通过该共享资源完成线程的通信。
实例:工厂——消费者——产品
工厂生产产品,消费者消费产品,产品就成了两者之间的共享资源
产品的成员属性:产品名,产品价格,是否需要生产的标识
public class Goods{
private String name;
private float price;
private boolean product;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public boolean isProduct() {
return product;
}
public void setProduct(boolean product) {
this.product = product;
}
public Goods() {
super();
// TODO Auto-generated constructor stub
}
public Goods(String name, float price, boolean product) {
super();
this.name = name;
this.price = price;
this.product = product;
}
}
工厂根据是否需要生产的标识来生产产品
1.判断是否需要生产
如果需要生产,就修改生产标识,唤醒消费者线程,如果不需要生产,就进入无限等待状态,等候被唤醒
public class Produce implements Runnable {
private Goods goods = null;
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
synchronized (goods) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//需要生产
if (goods.isProduct()) {
if (Math.random() > 0.5) {
goods.setName("擀面皮");
goods.setPrice(6.0F);
}else {
goods.setName("烤羊排");
goods.setPrice(128);
}
//修改标记
goods.setProduct(false);
System.out.println("生产者生产了"+goods.getName()+":"+goods.getPrice());
//唤醒消费者
goods.notify();
System.out.println("需要唤醒消费者消费");
}
else {
//生产者进人无限等待状态
System.out.println("生产者进入无限等待");
try {
goods.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public Produce(Goods goods) {
super();
this.goods = goods;
}
}
消费者消费判断生产标识,不需要生产代表可以消费,消费了就要修改生产标识,唤醒生产者进程,如果需要生产那么,消费者进程就进入无限等待,等待唤醒
public class Custmor implements Runnable {
private Goods goods = null;
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
synchronized (goods) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//判断是否可以进行消费
if(!goods.isProduct()) {
//更改生产状态
goods.setProduct(true);
System.out.println("消费者消费了"+goods.getName()+"花了"+goods.getPrice());
//唤醒生产者生产
System.out.println("唤醒生产者");
goods.notify();
}
else {
//让消费者进入等待
System.out.println("消费者进入等待");
try {
goods.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public Custmor(Goods goods) {
super();
this.goods = goods;
}
}