Java多线程中wait, notify and notifyAll的使用
来源:互联网 发布:缠中说禅炒股软件 编辑:程序博客网 时间:2024/05/16 05:44
本文为翻译文章,原文地址:http://www.journaldev.com/1037/java-thread-wait-notify-and-notifyall-example
在Java的Object类中有三个final的方法允许线程之间进行资源对象锁的通信,他们分别是: wait(), notify() and notifyAll()。
调用这些方法的当前线程必须拥有此对象监视器,否则将会报java.lang.IllegalMonitorStateException exception异常。
wait
Object的wait方法有三个重载方法,其中一个方法wait() 是无限期(一直)等待,直到其它线程调用notify或notifyAll方法唤醒当前的线程;另外两个方法wait(long timeout) 和wait(long timeout, int nanos)允许传入 当前线程在被唤醒之前需要等待的时间,timeout为毫秒数,nanos为纳秒数。
notify
notify方法只唤醒一个等待(对象的)线程并使该线程开始执行。所以如果有多个线程等待一个对象,这个方法只会唤醒其中一个线程,选择哪个线程取决于操作系统对多线程管理的实现。
notifyAll
notifyAll 会唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操作系统的实现。
这些方法可以使用于“生产者-消费者”问题,消费者是在队列中等待对象的线程,生产者是在队列中释放对象并通知其他线程的线程。
让我们来看一个多线程作用于同一个对象的例子,我们使用wait, notify and notifyAll方法。
通过实例来理解
Message
一个java bean类,线程将会使用它并调用wait和notify方法。
Message.java
package com.journaldev.concurrency;public class Message { private String msg; public Message(String str){ this.msg=str; } public String getMsg() { return msg; } public void setMsg(String str) { this.msg=str; }}
Waiter
一个Waiter类,等待其它的线程调用notify方法以唤醒线程完成处理。注意等待线程必须通过加synchronized同步锁拥有Message对象的监视器。
Waiter.java
package com.journaldev.concurrency;public class Waiter implements Runnable{ private Message msg; public Waiter(Message m){ this.msg=m; } @Override public void run() { String name = Thread.currentThread().getName(); synchronized (msg) { try{ System.out.println(name+" waiting to get notified at time:"+System.currentTimeMillis()); msg.wait(); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(name+" waiter thread got notified at time:"+System.currentTimeMillis()); //process the message now System.out.println(name+" processed: "+msg.getMsg()); } }}
Notifier
一个Notifier类,处理Message对象并调用notify方法唤醒等待Message对象的线程。注意synchronized代码块被用于持有Message对象的监视器。
Notifier.java
package com.journaldev.concurrency;public class Notifier implements Runnable { private Message msg; public Notifier(Message msg) { this.msg = msg; } @Override public void run() { String name = Thread.currentThread().getName(); System.out.println(name+" started"); try { Thread.sleep(1000); synchronized (msg) { msg.setMsg(name+" Notifier work done"); msg.notify(); // msg.notifyAll(); } } catch (InterruptedException e) { e.printStackTrace(); } }}
WaitNotifyTest
一个测试类,交付创建多个等待线程和一个通过线程,并启动这些线程。
WaitNotifyTest.java
package com.journaldev.concurrency;public class WaitNotifyTest { public static void main(String[] args) { Message msg = new Message("process it"); Waiter waiter = new Waiter(msg); new Thread(waiter,"waiter").start(); Waiter waiter1 = new Waiter(msg); new Thread(waiter1, "waiter1").start(); Notifier notifier = new Notifier(msg); new Thread(notifier, "notifier").start(); System.out.println("All the threads are started"); }}
当我们调用以上的代码时可以看到以下的输出,但并没有结束(完成),因为有两个线程等待同一个Message对象,但notify()方法只能唤醒一个线程,另一个线程仍然在等待被唤醒。
notify()
waiter waiting to get notified at time:1356318734009waiter1 waiting to get notified at time:1356318734010All the threads are startednotifier startedwaiter waiter thread got notified at time:1356318735011waiter processed: notifier Notifying work done
如果我们注释掉Notifier类中的notify() 方法的调用,并打开notifyAll() 方法的调用,将会有以下的输出信息。
notifyAll()
waiter waiting to get notified at time:1356318917118waiter1 waiting to get notified at time:1356318917118All the threads are startednotifier startedwaiter1 waiter thread got notified at time:1356318918120waiter1 processed: notifier Notifying work donewaiter waiter thread got notified at time:1356318918120waiter processed: notifier Notifying work done
一旦notifyAll()方法唤醒所有的Waiter线程,程序将会执行完成并退出。
- Java多线程中wait, notify and notifyAll的使用
- Java多线程中wait, notify and notifyAll的使用
- Java多线程中wait, notify and notifyAll的使用
- Java多线程设计wait、notify、notifyall、synchronized的使用机制
- java多线程当中wait notify notifyAll的使用
- java多线程设计wait、notify、notifyall、synchronized的使用机制
- Java多线程,wait,notify,notifyAll的使用例子
- java 多线程 wait()和notify(),notifyAll()的使用
- JAVA多线程的理解wait、notify、notifyAll
- 多线程中wait(),notify(),notifyAll()
- java多线程wait() ,notify() notifyAll()
- java中wait()、notify()以及notifyAll()的使用
- java中wait,notify,notifyAll的使用方法
- 【Java多线程】之五:wait, notify and notifyAll
- java wait notify notifyAll and 多线程顺序打印ABCD
- wait, notify, notifyAll的使用
- java多线程中wait()和notify()和notifyAll()及其他常用方法使用
- android-多线程设计wait、notify、notifyall、synchronized的使用机制
- 6.27 目前技术学习视野
- STL 笔记(四) 迭代器 iterator
- 创建模式——单例模式
- 从附加数据Overlay说开去-记一次讨论
- 睡眠时间
- Java多线程中wait, notify and notifyAll的使用
- Java基础之集合3
- SecureCRT连接Ubuntu失败(远程系统拒绝访问)
- JAVA基础之多态
- OC基础语法-1.OC和C语言的对比
- 03-树2. List Leaves(25)
- CSS基本语法
- php页面静态化—动态页面和静态页面
- Windows 驱动开发 - 7