线程暂停:
Thread.wait()需要notify()方法激活,notify是Object类提供的方法,只能激活当前第一个上锁状态的线程,或者优先级高的线程,而notifuAll可以全部解锁
以下是实例:
//生产类
class DataProvider implements Runnable {
private Data data;
public DataProvider(Data data) {
this.data = data;
}
public void run() {
for(int x = 0; x < 100; x ++) {
if(x % 2 == 0) {
this.data.set("苹果","水果"); //设置产品1
} else {
this.data.set("苹果","手机"); //设置产品2
}
}
}
}
//消费者类
class DataConsumer implements Runnable {
private Data data;
public DataConsumer(Data data) {
this.data = data;
}
public void run() {
for(int x =0; x < 50; x ++) {
try {
Thread.sleep(10);
} catch(InterruptedException e) {
e.printStackTrace();
}
this.data.get(); //每10ms获取从中介处获取产品
}
}
}
//中介类
class Data {
private String title; //商品名
private String note; //商品标签
private boolean flag = false; //生产消费控制
public synchronized void set(String title,String note) {
while(this.flag == true) { //商品流通时不补给
try{
super.wait(); //继承Object类
}catch (InterruptedException e) {
e.printStackTrace();
}
}
// 商品不流通时补给
this.title = title;
this.note = note;
// 补给完毕开始流通
this.flag = true;
super.notify(); //给第一个锁解锁(当前运行消费者类的线程上锁状态)
}
public synchronized void get() {
while(flag == false) { //补给时不能购买
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 不补给时可以购买
System.out.println(this.title+" = "+this.note);
this.flag = false; //购买完毕开始补给
super.notify(); //给上锁的解锁(当前运行生产者类的线程上锁状态)
}
}
public class TestDemo{
public static void main(String[] args) {
Data data = new Data(); //实例化中介类
new Thread(new DataProvider(data)).start(); //把中介类设置成生产类的成员,用线程启动生产类
new Thread(new DataConsumer(data)).start(); //把同一个中介类设置成消费者类的成员,用线程启动
}
}