`
wandejun1012
  • 浏览: 2738306 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

wait notify

    博客分类:
  • java
 
阅读更多

 

wait和notify是线程间通讯时用到。最典型的就是生产者消费者模型。

wait和notify要想运行成功,必须是相对于同一个对象锁而言的。

即用synchronized(obj)这个方法时,此obj必须是同一个obj.

否则wait和notify无法协调完成工作。

注意:notify是不阻塞的,只有wait才是阻塞的。只阻塞当前线程。一个形象的比喻就是,生产者不断的往房间里面扔东西,扔完一个就鬼喊一下快来取(container.notify),但是他自身不阻塞,还是继续往房间里扔东西。同时消费者不一定有能力来做,待CPU时间片轮到它时,它才来做。

 

consume代码:

package ProductAndConsume;

import java.util.List;

public class Consume implements Runnable {
	private List container = null;
	private int count;

	public Consume(List lst) {
		this.container = lst;
	}

	public void run() {
		while (true) {
			synchronized (container) {
				if (container.size() == 0) {
					try {
						container.wait();// 放弃锁
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				container.remove(0);
				container.notify();
				System.out.println(Thread.currentThread().getName()+"^_^我吃了编号为" + (++count));
			}

		}
	}
}

 

 

2、product代码:

package ProductAndConsume;

import java.util.List;

public class Product implements Runnable {
	private List container = null;
	private int count;

	public Product(List lst) {
		this.container = lst;
	}

	@SuppressWarnings("unchecked")
	public void run() {
		while (true) {
			synchronized (container) {
				if (container.size() > MultiThread.MAX) {
					try {
						container.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				container.add(new Object());
				container.notify();
				System.out.println(Thread.currentThread().getName()+"^_^我生产的编号为" + (++count));
			}
		}
	}
}

 

3、MultiThread代码:

package ProductAndConsume;

import java.util.ArrayList;
import java.util.List;

public class MultiThread {
	private List container = new ArrayList();
	public final static int MAX = 5;

	public static void main(String args[]) {
		MultiThread m = new MultiThread();
		new Thread(new Consume(m.getContainer())).start();
		new Thread(new Product(m.getContainer())).start();
	}

	public List getContainer() {
		return container;
	}

	public void setContainer(List container) {
		this.container = container;
	}
}

 

 

 

 

 

refurl:http://blog.sina.com.cn/s/blog_62dfe3ca0100k9tf.html

 

http://longdick.iteye.com/blog/453615

 

 

 

 

 

 

 

分享到:
评论

相关推荐

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

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

    wait和notify讲解

    wait和notify讲解

    Java 同步锁 wait notify 学习心得

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

    wait_notify_demo

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

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

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

    等待机制与锁机制wait notify

    本文将深入探讨`wait`、`notify`以及`notifyAll`这三个关键字的使用及其背后的原理,帮助你理解如何在实际编程中有效地利用它们来解决线程同步问题。 首先,我们需要了解Java中的对象锁。每个Java对象都有一个内置...

    Java多线程wait和notify

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

    Java 同步方式 wait和notify/notifyall

    在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...

    39.线程间的通信-wait与notify-wait方法自动释放锁与notify方法不会释放锁.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    浅谈java多线程wait,notify

    _java多线程wait、notify机制详解_ 在Java多线程编程中,wait和notify是两个非常重要的机制,用于实现线程之间的通信和同步。在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地...

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

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

    Object类wait及notify方法原理实例解析

    Object类wait及notify方法原理实例解析 Object类中的wait和notify方法是Java多线程编程中最重要的同步机制之一,它们是Java.lang.Object类中的两个方法,用于在多线程之间进行通信和同步。wait方法将当前线程置于...

    Java的sychronized、wait和notify范例

    `synchronized`关键字、`wait()`和`notify()`方法是Java多线程中用于控制并发访问共享资源的重要工具,它们是Java内存模型(JMM)的一部分,主要用于解决线程间的同步问题。 一、`synchronized`关键字 `...

    详解Java程序并发的Wait-Notify机制

    Java程序并发的Wait-Notify机制是Java多线程编程中的一种重要同步工具,它允许线程之间通过共享对象进行通信和协作。这个机制基于Java的内置锁(也称为监视器锁),通常与`synchronized`关键字一起使用。在Java中,`...

    Java 中Object的wait() notify() notifyAll()方法使用

    Java 中Object的wait() notify() notifyAll()方法使用 在Java并发编程中,Object的wait()、notify()和notifyAll()方法是非常重要的概念,这三个方法都是Object类的方法,可以认为任意一个Object都是一种资源(或者...

    java中几个notify、wait使用实例

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

    深入理解Wait、Notify和Wait与sleep区别

    本文将深入探讨`wait()`, `notify()`以及它们与`sleep()`方法的区别,这些都是Java中与线程同步密切相关的概念。 首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。...

    signal-promise:简单的waitnotify承诺与可选的最大等待时间

    notify ( ) } ) while ( await input . wait ( ) ) { console . log ( 'someone typed!' ) } 原料药 s = new Signal() 发出新信号 await s.wait([maxWaitTime]) 等待有人打电话通知。 如果指定maxWaitTime ,则...

    主线程去控制子线程wait与notify

    在Java多线程编程中,`wait()`和`notify()`是两个非常重要的方法,它们用于线程间的协作和通信。这两个方法是Java语言中的Object类提供的,因此所有的对象都可以使用。在本文中,我们将深入探讨如何使用主线程来控制...

    wait()、notify()和notifyAll()方法2---马克-to-win java视频

    wait()、notify()和notifyAll()方法2---马克-to-win java视频

Global site tag (gtag.js) - Google Analytics