synchronized(b){...};的意思是定义一个同步块,使用b作为资源锁。b.wait();的意思是临时释放锁,并阻塞当前线程,好让其他使用同一把锁的线程有机会执行,在这里要用同一把锁的就是b线程本身.这个线程在执行到一定地方后用notify()或者notifyAll()通知wait的线程,将所有wait这个锁的,锁已经用完,待notify()所在的同步块运行完之后,wait所在的线程就可以继续执行.
Nick says:
如果不把b.wait()和b.notify()放到一个同一个锁内,会出现如下异常:
如果有好几个进程在b对象阻塞,当调用一次notify时,只能有一个线程唤醒,如果使用
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.notify(Native Method)
at org.apache.hadoop.ipc.ThreadB.run(WaitNotifyTest.java:100)
例子1:
--------------------------------------------------------------------------------
public class WaitNotifyTest {
private static Call call = new Call();
public static void notify1() {
Thread thread = new Thread() {
public void run() {
try {
Thread.sleep(1000);
call.callFinish();
Thread.sleep(1000);
System.out.println("notify end");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
thread.start();
}
public static void lala() {
synchronized (call) {
System.out.println("en");
notify1();
try {
call.wait(50000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("lala");
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
lala();
System.out.println("lala end");
}
static class Call {
public synchronized void callFinish() {
notify();
}
}
}
结果是:
en
lala
lala end
notify end
这里表面上看似乎notify没有在一个锁里面,但是注意到callFinish()是有synchronized 修饰的,相当于synchronized(this){...} 而在lala里面有一个synchronized (call) {} 这个call对象和 call.callFinish()都是一个对象,所以他们是针对同一个对象的锁。
或者如下写:
public static void notify1() {
Thread thread = new Thread() {
public void run() {
try {
Thread.sleep(1000);
synchronized(call){
call.notify();
}
Thread.sleep(1000);
System.out.println("notify end");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
thread.start();
}
notify()让因wait()进入阻塞队列里的线程(blocked状态)变为runnable,然后发出notify()动作的线程继续执行完,待其完成后,进行调度时,调用wait()的线程可能会被再次调度而进入running状态。
分享到:
相关推荐
首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。这些方法只能在同步环境中(如`synchronized`块或方法)使用,否则会抛出`IllegalMonitorStateException`。它们的...
wait和notify讲解
为了实现这一点,我们可以使用`wait()`和`notify()`来控制线程的执行顺序。具体实现如下: 1. 在每个线程中,使用`synchronized`关键字锁定同一个对象。 2. 当一个线程完成其打印任务后,调用`notify()`方法唤醒另...
在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...
在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
Java之wait和notify的用法详解 在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object...
`wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...
5. notify 和wait 的顺序不能错,如果A线程先执行notify方法,B线程在执行wait方法,那么B线程是无法被唤醒的。 6. notify 和 notifyAll的区别notify方法只唤醒一个等待(对象的)线程并使该线程开始执行,而...
源码—Java多线程5—死锁和wait notify notifyAll
wait()、notify()和notifyAll()方法2---马克-to-win java视频
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
### 一个理解wait()与notify()的例子 #### 知识点概述 本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要...
`synchronized`关键字、`wait()`和`notify()`方法是Java多线程中用于控制并发访问共享资源的重要工具,它们是Java内存模型(JMM)的一部分,主要用于解决线程间的同步问题。 一、`synchronized`关键字 `...
wait()、notify()和notifyAll()方法1---马克-to-win java视频
在Java多线程编程中,`wait()`和`notify()`是两个非常重要的方法,它们用于线程间的协作和通信。这两个方法是Java语言中的Object类提供的,因此所有的对象都可以使用。在本文中,我们将深入探讨如何使用主线程来控制...
标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在Java多线程编程中,wait和notify是两个非常重要的机制,用于实现线程之间的通信和同步。在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在...