今天去凤凰网面试了,可惜自己准备的东西都没有面到,有些紧张,其间有问到一个wait,notify的使用场景,答曰:生产者与消费者模式,当时只写了个大概,现在将代码贴出。
储存柜
package cuspro; import java.util.ArrayList; import java.util.List; public class Storage { private List<Object> foods; public final static int MAX_SIZE = 5; public Storage(){ foods = new ArrayList<Object>(); } public List<Object> getFoods() { return foods; } public void setFoods(List<Object> foods) { this.foods = foods; } }
运行类,内部有:生产者,消费者两个内部类实现了Runnable接口:
package cuspro; public class Company { public static void main(String[] args) { Company c = new Company(); Object lock = new Object(); Storage storage = new Storage(); try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } new Thread(c.new Customer(storage, lock)).start(); new Thread(c.new Producer(storage, lock)).start(); new Thread(c.new Customer(storage, lock)).start(); new Thread(c.new Producer(storage, lock)).start(); new Thread(c.new Customer(storage, lock)).start(); new Thread(c.new Producer(storage, lock)).start(); new Thread(c.new Customer(storage, lock)).start(); new Thread(c.new Producer(storage, lock)).start(); new Thread(c.new Customer(storage, lock)).start(); new Thread(c.new Producer(storage, lock)).start(); new Thread(c.new Customer(storage, lock)).start(); new Thread(c.new Producer(storage, lock)).start(); } /** * 消费者 * * @author xtuali * */ private class Customer implements Runnable { private Storage storage; private Object lock; public Customer(Storage storage, Object lock) { super(); this.storage = storage; this.lock = lock; } public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } synchronized (lock) { while (storage.getFoods().size() <= 0) { try { System.out.println("货物已空,提示生产者生产"); lock.wait(); //当前线程在lock上等待,并释放锁 } catch (InterruptedException e) { e.printStackTrace(); } } storage.getFoods().remove(0); lock.notifyAll(); //唤醒消费者与生产者 System.out.println("消费者消费1, "+Thread.currentThread().getName()+", 余量:"+storage.getFoods().size()); } } } } /** * 生产者 * * @author xtuali * */ private class Producer implements Runnable { private Storage storage; private Object lock; public Producer(Storage storage, Object lock) { super(); this.storage = storage; this.lock = lock; } public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } synchronized (lock) { while (storage.getFoods().size() >= Storage.MAX_SIZE) { try { System.out.println("货物已满,提示消费者消费"); lock.wait(); //当前线程在lock上等待,并释放锁 } catch (InterruptedException e) { e.printStackTrace(); } } storage.getFoods().add(1); lock.notifyAll(); //唤醒消费者与生产者 System.out.println("生产者生产1, "+Thread.currentThread().getName() +",余量:"+storage.getFoods().size()); } } } } }
之前考虑在Customer与Producer内部申明两个lock,一个是用来与Producer线程来通信,一个是用来与Customer线程来通信,但是锁没法释放,所以就只用了一个lock,但是这一个lock也解决了问题了!
相关推荐
java多线程之wait,notify的用法([ 详解+实例 ]).
使用Java多线程的wait和notify方法实现最简单的生产者消费者模式
源码—Java多线程5—死锁和wait notify notifyAll
Java 同步方式 wait和notify/notifyall
java多线程下wait和notify的作用
java中多线程编程notify、wait的使用
wait和notify讲解
JAVAWAIT和NOTIFY的用法.pdf
在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...
Java多线程的样例代码,工程,内含wait()、notify()和sychronized的使用范例。
开一个子线程来完成一个循环处理的工作,我在主线程中能灵活控制这个子线程的开始、暂停/继续、结束。
主要介绍了Java多线程中wait、notify、notifyAll使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
wait()、notify()和notifyAll()方法2---马克-to-win java视频
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
wait()、notify()和notifyAll()方法1---马克-to-win java视频
主要介绍了详解Java程序并发的Wait-Notify机制,多线程并发是Java编程中的重要部分,需要的朋友可以参考下
java-wait和notify的用法.pdf
一个简单的线程同步机制,也能实例了解wait notify的使用,notify与notifyAll的区别
主要介绍了java多线程wait,notify,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面小编和大家一起来学习一下吧
java代码-wait-notify 生产者消费者