`
luzl
  • 浏览: 572074 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

wait notify notifyall

    博客分类:
  • Java
阅读更多
Java的wait方法就是使拥有当前对象(Object)的线程(Thread)放弃锁(release lock).进入睡眠状态.
notify 通知在对象(Object)上因调用wait而等待的某一进程启动.
notifyAll 通知在对象(Object)上因调用wait而等待的所有进程启动.这些进程根据优先级顺序执行.

package scjp;

class Q {
	int n;
	boolean valueSet=false;
	
	public synchronized int get(){
		//if valueSet == false,wait else try to got value
		if(!valueSet)
		try {
			wait();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("Got n " + n);
		valueSet=false;
		notify();
		return n;
	}
	
	public synchronized void put(int n){
		//if valueSet == true,already have value so wait fetch,else put
		if(valueSet)
		try {
			wait();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.n=n;
		System.out.println("Put n " + n);
		valueSet=true;
		notify();
	}
}

class Producer implements Runnable{
	Q q=null;
	
	Producer (Q q){
		this.q=q;
		(new Thread(this,"Producer")).start();
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		int i=0;
		while (i<10) {
			q.put(i++);
		}
		
	}
}

class Consumer implements Runnable{
	Q q=null;
	
	public Consumer(Q q) {
		// TODO Auto-generated constructor stub
		this.q=q;
		(new Thread(this,"Consumer")).start();
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		while (q.get()<9) {}
	}
	
	
	
}
public class DemoThread {
	public static void main(String[] args) {
		Q q=new Q();
		new Producer(q);
		new Consumer(q);
	}
}



这段代码是Java2教学中的代码,今天拿来再讨论讨论:
首先两个线程启动,他们的执行占用CPU多少随机.但是这里因为加了一个锁的Boolean型变量,而控制了put与set.
首先:创建了一个对象Q,创建了一个Producer,一个Consumer,这两个对象在构造方法中启动了线程.
第一步:
    对于Producer来说,会首先去调用put方法,因为valueSet是默认值是false,所以在Q的put方法不执行wait而是执行。执行完毕后设置为true.
    对于Consumer来说,会首先去调用get方法,因为valueSet是默认值是false,所以该线程会wait.
第二步:
   对于Producer来说,因为valueSet已经变成true,所以会wat.
   对于Consumer来说,因为valueSet已经变成true,所以会执行下面的code(get value),然后设置valueSet为false.
第三步:
   Producer执行put方法,因为valueSet为True
   Consumer等待
依次类推,方法执行...

这里关键是加了一个共享的变量,valueSet来判是该取值get,还是put值.当然有了wait跟notify才使它成为了可以实现的。
但是不管怎样,wait是使目前控制该对象的线程wait(等待),notify是使前面在该对象上面wait的方法继续执行.
呵呵,不知道我讲明白了没有。
分享到:
评论

相关推荐

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

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

    Java 同步方式 wait和notify/notifyall

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

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

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

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

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。  在 Java 中可以用 wait、notify 和 notifyAll 来实现...

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

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

    wait和notifyAll方法的使用示例

    当其他线程调用同一个对象的 `notify()` 或 `notifyAll()` 方法时,等待线程有机会重新获得锁并继续执行。需要注意的是,调用 `wait()` 方法必须在 `synchronized` 块或方法中进行,否则会抛出 `...

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

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

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

    wait方法是Object类的一个方法,用于让当前线程进入等待状态,直到其他线程调用notify或notifyAll方法来唤醒它。在wait方法中,当前线程会释放它所占有的锁,并进入等待状态。wait方法可以带有参数,指定等待的时间...

    java面试题经典讲解2023年最新题目分析.docx

    10. HashMap什么样的类适合作为键String最为常见,因为String对象不可变,且重写了equals和hashcode方法。...sleep可在任意地方使用,wait notify notifyAll只能在synchronized块\方法中使用。sleep必须捕获异常

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

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

    wait_notify_demo

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

    Java wait和notifyAll实现简单的阻塞队列

    Java wait和notifyAll实现简单的阻塞队列 在 Java 中,wait 和 notifyAll 是两个非常重要的方法,它们都是在 Object 类中声明的,用于实现线程之间的通信和同步。wait 方法会使调用线程进入等待状态,并释放所持有...

    Java多线程wait和notify

    `wait()` 方法会让当前持有锁的线程进入等待状态,释放锁,直到其他线程调用 `notify()` 或 `notifyAll()` 唤醒它。`notify()` 则会随机选择一个等待在该对象监视器上的线程并唤醒它,而 `notifyAll()` 则会唤醒所有...

    Java的wait(), notify()和notifyAll()使用心得

    Java中的`wait()`, `notify()`, 和 `notifyAll()` 是多线程编程中的关键工具,它们用于在并发环境中协调线程间的交互。这些方法都定义在`java.lang.Object`类中,因为它们与对象的监视器(monitor)概念密切相关。...

    【并发编程】 — 线程间的通信wait、notify、notifyAll

    文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...

    Java 同步锁 wait notify 学习心得

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

    等待机制与锁机制wait notify

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

    Java多线程同步(wait()notify()notifyAll())[文].pdf

    本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **wait()方法**: - wait()是Object类的一个方法,它的作用是让当前线程暂停执行并释放它...

    Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll)

    Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll) Java多线程基础中的线程等待与唤醒是一种常见的线程协作机制,通过wait()、notify()和notifyAll()方法来实现线程之间的同步和通信。在本节中,我们将...

    Java notify和notifyAll的区别和相同

    Java中的`notify`和`notifyAll`是多线程编程中的关键方法,它们用于线程间的通信,特别是在处理同步机制时。这两个方法都是在`Object`类中定义的,因此可以应用于任何Java对象。 首先,我们需要理解Java的同步机制...

Global site tag (gtag.js) - Google Analytics