700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 线程协作--wait notify:经典消费者生产者

线程协作--wait notify:经典消费者生产者

时间:2020-11-01 16:40:24

相关推荐

线程协作--wait notify:经典消费者生产者

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、未知(手动狗头)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。