wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。
这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。
- 如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。
- 如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行。
- 如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。
其中wait方法有三个over load方法:
wait()
wait(long)
wait(long,int)
wait方法通过参数可以指定等待的时长。如果没有指定参数,默认一直等待直到被通知。
和synchronize结合使用
http://longdick.iteye.com/blog/453615 讲解的异常java.lang.IllegalMonitorStateException。
- 任何一个时刻,对象的控制权(monitor)只能被一个线程拥有。
- 无论是执行对象的wait、notify还是notifyAll方法,必须保证当前运行的线程取得了该对象的控制权(monitor)
- 如果在没有控制权的线程里执行对象的以上三种方法,就会报java.lang.IllegalMonitorStateException异常。
- JVM基于多线程,默认情况下不能保证运行时线程的时序性
修改后的代码
package com.swntek.czm.myzxingdemo;
public class NotifyTest {
private Boolean flag = true;
private Object obj = new Object();
class NotifyThread extends Thread {
public NotifyThread(String name) {
super(name);
}
public void run() {
try {
sleep(3000);//推迟3秒钟通知
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj) {
flag = false;
obj.notifyAll();
}
}
}
class WaitThread extends Thread {
public WaitThread(String name) {
super(name);
}
public void run() {
synchronized (obj) {
while (flag) {
System.out.println(getName() + " begin waiting!");
long waitTime = System.currentTimeMillis();
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
waitTime = System.currentTimeMillis() - waitTime;
System.out.println("wait time :" + waitTime);
}
System.out.println(getName() + " end waiting!");
}
}
}
public static void main(String[] args) throws InterruptedException {
System.out.println("Main Thread Run!");
NotifyTest test = new NotifyTest();
NotifyThread notifyThread = test.new NotifyThread("notify01");
WaitThread waitThread01 = test.new WaitThread("waiter01");
WaitThread waitThread02 = test.new WaitThread("waiter02");
WaitThread waitThread03 = test.new WaitThread("waiter03");
notifyThread.start();
waitThread01.start();
waitThread02.start();
waitThread03.start();
}
}
jdk1.5Lock取代了synchronized
Condition替代了wait notify
private Lock lock=new ReentrantLock();
private Lock lock=new ReentrantLock();
Condition con=lock.newCondition();
con.await();con.signal();con.signalAll()
http://ifeve.com/understand-condition/
package com.swntek.czm.myzxingdemo;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class NotifyTest {
private static Lock reentrantLock = new ReentrantLock();
private static Condition condition;
private Boolean flag = true;
class NotifyThread extends Thread {
public NotifyThread(String name) {
super(name);
}
public void run() {
try {
sleep(3000);//推迟3秒钟通知
} catch (InterruptedException e) {
e.printStackTrace();
}
reentrantLock.lock();
flag = false;
condition.signalAll();
reentrantLock.unlock();
}
}
class WaitThread extends Thread {
public WaitThread(String name) {
super(name);
}
public void run() {
reentrantLock.lock();
while (flag) {
System.out.println(getName() + " begin waiting!");
long waitTime = System.currentTimeMillis();
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
waitTime = System.currentTimeMillis() - waitTime;
System.out.println("wait time :" + waitTime);
}
System.out.println(getName() + " end waiting!");
reentrantLock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
System.out.println("Main Thread Run!");
condition = reentrantLock.newCondition();
NotifyTest test = new NotifyTest();
NotifyThread notifyThread = test.new NotifyThread("notify01");
WaitThread waitThread01 = test.new WaitThread("waiter01");
WaitThread waitThread02 = test.new WaitThread("waiter02");
WaitThread waitThread03 = test.new WaitThread("waiter03");
notifyThread.start();
waitThread01.start();
waitThread02.start();
waitThread03.start();
}
}
分享到:
相关推荐
源码—Java多线程5—死锁和wait notify notifyAll
Java 同步方式 wait和notify/notifyall
主要介绍了Java 中Object的wait() notify() notifyAll()方法使用的相关资料,需要的朋友可以参考下
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
wait()、notify()和notifyAll()方法2---马克-to-win java视频
wait()、notify()和notifyAll()方法1---马克-to-win java视频
主要介绍了Java多线程中wait、notify、notifyAll使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
一个简单的线程同步机制,也能实例了解wait notify的使用,notify与notifyAll的区别
本篇文章是对java的 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下
文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...
主要介绍了Java wait和notifyAll实现简单的阻塞队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java多线程同步(wait()notify()notifyAll())[文].pdf
本篇文章是对java多线程 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下
3.wait,notify和notifyAll只能在同步方法或同步代码块中调用,而sleep可以在任何地方调用; 4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。(如果不是在同步方法或同步代码块中调用wait()方法,...
主要介绍了Java多线程基础 线程的等待与唤醒,需要的朋友可以参考下
绍java多线程之wait(),notify(),notifyAll()
本文通过demo详细的介绍了Lock,wait,notify,notifyAll等知识点
4.线程间通信:lock、condition、wait、notify、notifyAll 5.Lock-free:atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList 6.关于锁的经验介绍 7.并发流程控制手段:CountDownLatch、Barrier 8.定时器:...
java多线程应用实例,包括wait、notify、notifyAll等的应用方法,经过调试,可以直接运行。
自己写的一个生产者消费者问题的一个实例,特别注意了wait,notify和notifyAll的不同应用场景。