JDK 中关于wait,notify这两个方法的介绍:
1、wait:线程进入阻塞。
synchronized (obj) {while (<condition does not hold>)obj.wait();... // Perform action appropriate to condition}
2、notify:唤醒线程。
注意的点:
1、使用这两个方法,必须拥有对象的监视器。
2、线程在执行完wait方法后,进入阻塞,释放锁。
3、执行notify方法后,唤醒执行wait方法的线程,执行wait之后的代码逻辑。
生产者消费者示例:
public class producer implements Runnable{//生产者
private List<Long> lists; //仓库,get/set方法未给出
public void run(){
while(true){
synchronized(lists){ //拥有对象的监视器
lists.add(System.currentTimeMillis()); //这里取时间戳
if(lists.size() > 100){ // 当库存大于 100 时候,则唤醒消费者线程,且暂停生产
lists.notify();//拥有监视器的对象,才能执行wait,notify 的操作。
lists.wait();
}
}
}
}
}
public class consumer implements Runnable { //消费者
private List<Long> lists; //同生产者
public void run(){
while(true){
synchronized(lists){
lists.remove(0); //取第一个元素
if(lists.size() < 1){
lists.notify(); // 唤醒生产者线程
lists.wait(); //暂停消费者线程
}
}
}
}
}
测试代码:
public class MainTest {
public static void main(String[] args) {
test1();
}
private static void test1() {
List<Long> lists = new ArrayList<Long>();
producerp = new producer(lists,); //构造方法进行对象的传递,下同
Consumer c = new Consumer(lists,);
new Thread(p).start();
new Thread(c).start();
}
}
待完善的地方:
1、lists 不是线程安全的。
2、消费者和生产者不能间隔执行,wait方法未唤醒,一直阻塞。
3、未知(手动狗头)