`
xtuali
  • 浏览: 12074 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java wait notify 的使用场景——凤凰网面试

阅读更多

今天去凤凰网面试了,可惜自己准备的东西都没有面到,有些紧张,其间有问到一个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也解决了问题了!

0
1
分享到:
评论

相关推荐

    java之wait,notify的用法([ 详解+实例 ])

    Java之wait和notify的用法详解 在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object...

    wait_notify_demo

    `wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...

    115个Java面试题和答案——终极列表

    - **同步机制**:synchronized关键字,wait(), notify(), notifyAll()方法,以及Lock接口。 6. **内存管理** - **垃圾回收**:Java自动进行内存管理,理解垃圾收集的工作原理和如何避免内存泄漏。 - **堆和栈**...

    源码—Java多线程5—死锁和wait notify notifyAll

    源码—Java多线程5—死锁和wait notify notifyAll

    Java多线程wait和notify

    在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...

    Java 同步锁 wait notify 学习心得

    标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...

    Java 同步方式 wait和notify/notifyall

    下面是一个简单的生产者消费者模型示例,演示了`wait()`, `notify()` 的使用: ```java public class Buffer { private int data; private boolean available = false; public synchronized void put(int item)...

    java实际公司面试题目

    面试者需要理解同步机制(synchronized关键字,wait(), notify()和notifyAll()),死锁和活锁的概念,以及并发工具类(如Semaphore, CountDownLatch, CyclicBarrier)的使用。 5. **异常处理**:Java中的异常分为...

    java中几个notify、wait使用实例

    在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...

    Java多线程中wait、notify、notifyAll使用详解

    Java多线程中wait、notify、notifyAll使用详解 Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 ...

    115个Java面试题和答案——终极(上)(1).rar

    这份名为“115个Java面试题和答案——终极(上)(1).rar”的压缩包文件,显然是一个宝贵的资源,它包含了大量针对Java程序员的面试问题及其解答。这份文档(115个Java面试题和答案——终极(上)(1).docx)涵盖了从...

    Java的sychronized、wait和notify范例

    在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...

    如何在Java中正确使用 wait, notify 和 notifyAll

     在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...

    wait和notify讲解

    wait和notify讲解

    JAVAWAIT和NOTIFY的用法.pdf

    JAVAWAIT和NOTIFY的用法.pdf

    java面试——深圳-银盛支付-Java中级.zip

    这份"java面试——深圳-银盛支付-Java中级.zip"压缩包文件很可能包含了针对Java中级开发者的一系列面试问题和解答,旨在帮助求职者提升自己的技能,并在面试中脱颖而出。下面,我们将深入探讨一些可能涵盖的Java中级...

    超详细的Java复习知识点2019——个人笔记.zip

    7. **多线程**:Java内置了对多线程的支持,笔记可能会讲解Thread类的使用,线程同步机制(如synchronized,wait(),notify()等)以及并发工具类(如ExecutorService,Semaphore等)。 8. **接口与抽象类**:Java中...

    Java JDK 6学习笔记——ppt简体版

    理解线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock类。 11. **网络编程**:Java提供了Socket和ServerSocket类进行网络通信,理解客户端和服务器的工作原理...

    Java练手小项目——多线程聊天室.zip

    【Java练手小项目——多线程聊天室】 在Java编程世界中,多线程是不可或缺的一部分,尤其在开发实时性、交互性强的应用时,如我们的主题“多线程聊天室”。这个实战项目旨在帮助开发者深入理解Java多线程的概念,并...

    115个Java面试题和答案——终极(下)(1).rar

    这份名为“115个Java面试题和答案——终极(下)(1).rar”的压缩包文件包含了大量Java面试的相关问题及其解答,旨在帮助求职者提升面试表现。文档中的问题涵盖了Java语言的基础知识、进阶特性以及实际开发中的常见...

Global site tag (gtag.js) - Google Analytics