今天去凤凰网面试了,可惜自己准备的东西都没有面到,有些紧张,其间有问到一个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是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object...
`wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...
- **同步机制**:synchronized关键字,wait(), notify(), notifyAll()方法,以及Lock接口。 6. **内存管理** - **垃圾回收**:Java自动进行内存管理,理解垃圾收集的工作原理和如何避免内存泄漏。 - **堆和栈**...
源码—Java多线程5—死锁和wait notify notifyAll
在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...
标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...
下面是一个简单的生产者消费者模型示例,演示了`wait()`, `notify()` 的使用: ```java public class Buffer { private int data; private boolean available = false; public synchronized void put(int item)...
面试者需要理解同步机制(synchronized关键字,wait(), notify()和notifyAll()),死锁和活锁的概念,以及并发工具类(如Semaphore, CountDownLatch, CyclicBarrier)的使用。 5. **异常处理**:Java中的异常分为...
在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...
Java多线程中wait、notify、notifyAll使用详解 Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 ...
这份名为“115个Java面试题和答案——终极(上)(1).rar”的压缩包文件,显然是一个宝贵的资源,它包含了大量针对Java程序员的面试问题及其解答。这份文档(115个Java面试题和答案——终极(上)(1).docx)涵盖了从...
在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...
在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...
wait和notify讲解
JAVAWAIT和NOTIFY的用法.pdf
这份"java面试——深圳-银盛支付-Java中级.zip"压缩包文件很可能包含了针对Java中级开发者的一系列面试问题和解答,旨在帮助求职者提升自己的技能,并在面试中脱颖而出。下面,我们将深入探讨一些可能涵盖的Java中级...
7. **多线程**:Java内置了对多线程的支持,笔记可能会讲解Thread类的使用,线程同步机制(如synchronized,wait(),notify()等)以及并发工具类(如ExecutorService,Semaphore等)。 8. **接口与抽象类**:Java中...
理解线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock类。 11. **网络编程**:Java提供了Socket和ServerSocket类进行网络通信,理解客户端和服务器的工作原理...
【Java练手小项目——多线程聊天室】 在Java编程世界中,多线程是不可或缺的一部分,尤其在开发实时性、交互性强的应用时,如我们的主题“多线程聊天室”。这个实战项目旨在帮助开发者深入理解Java多线程的概念,并...
这份名为“115个Java面试题和答案——终极(下)(1).rar”的压缩包文件包含了大量Java面试的相关问题及其解答,旨在帮助求职者提升面试表现。文档中的问题涵盖了Java语言的基础知识、进阶特性以及实际开发中的常见...