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中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...
Java 中Object的wait() notify() notifyAll()方法使用 在Java并发编程中,Object的wait()、notify()和notifyAll()方法是非常重要的概念,这三个方法都是Object类的方法,可以认为任意一个Object都是一种资源(或者...
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
Java多线程中wait、notify、notifyAll使用详解 Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 ...
当其他线程调用同一个对象的 `notify()` 或 `notifyAll()` 方法时,等待线程有机会重新获得锁并继续执行。需要注意的是,调用 `wait()` 方法必须在 `synchronized` 块或方法中进行,否则会抛出 `...
wait()、notify()和notifyAll()方法2---马克-to-win java视频
wait方法是Object类的一个方法,用于让当前线程进入等待状态,直到其他线程调用notify或notifyAll方法来唤醒它。在wait方法中,当前线程会释放它所占有的锁,并进入等待状态。wait方法可以带有参数,指定等待的时间...
10. HashMap什么样的类适合作为键String最为常见,因为String对象不可变,且重写了equals和hashcode方法。...sleep可在任意地方使用,wait notify notifyAll只能在synchronized块\方法中使用。sleep必须捕获异常
wait()、notify()和notifyAll()方法1---马克-to-win java视频
`wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...
Java wait和notifyAll实现简单的阻塞队列 在 Java 中,wait 和 notifyAll 是两个非常重要的方法,它们都是在 Object 类中声明的,用于实现线程之间的通信和同步。wait 方法会使调用线程进入等待状态,并释放所持有...
`wait()` 方法会让当前持有锁的线程进入等待状态,释放锁,直到其他线程调用 `notify()` 或 `notifyAll()` 唤醒它。`notify()` 则会随机选择一个等待在该对象监视器上的线程并唤醒它,而 `notifyAll()` 则会唤醒所有...
Java中的`wait()`, `notify()`, 和 `notifyAll()` 是多线程编程中的关键工具,它们用于在并发环境中协调线程间的交互。这些方法都定义在`java.lang.Object`类中,因为它们与对象的监视器(monitor)概念密切相关。...
文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...
标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...
本文将深入探讨`wait`、`notify`以及`notifyAll`这三个关键字的使用及其背后的原理,帮助你理解如何在实际编程中有效地利用它们来解决线程同步问题。 首先,我们需要了解Java中的对象锁。每个Java对象都有一个内置...
本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **wait()方法**: - wait()是Object类的一个方法,它的作用是让当前线程暂停执行并释放它...
Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll) Java多线程基础中的线程等待与唤醒是一种常见的线程协作机制,通过wait()、notify()和notifyAll()方法来实现线程之间的同步和通信。在本节中,我们将...
Java中的`notify`和`notifyAll`是多线程编程中的关键方法,它们用于线程间的通信,特别是在处理同步机制时。这两个方法都是在`Object`类中定义的,因此可以应用于任何Java对象。 首先,我们需要理解Java的同步机制...