线程操作wait和notify
来源:互联网 发布:淘宝号被天猫蚁盾 编辑:程序博客网 时间:2024/05/14 17:27
线程进入运行状态之后,可以根据条件触发转为“等待阻塞”:
运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,
如下代码:
1、定义两个测试线程类
public class WaitTest1 extends Thread {private Object look;public WaitTest1(Object look) {this.look = look;}@Overridepublic void run() {try {synchronized (look) {System.out.println("wait start...");look.wait();System.out.println("wait end...");}} catch (Exception e) {e.printStackTrace();}}}public class WaitTest2 extends Thread {private Object look;public WaitTest2(Object look) {this.look = look;}@Overridepublic void run() {try {synchronized (look) {System.out.println("notify start...");look.notify();System.out.println("notify end...");}} catch (Exception e) {e.printStackTrace();}}}
2、测试类
public class WaitMain {public static void main(String[] args) {try {Object look = "abc";WaitTest1 thread1 = new WaitTest1(look);WaitTest2 thread2 = new WaitTest2(look);thread1.start();// 两秒后唤醒Thread.sleep(2000);thread2.start();} catch (Exception e) {e.printStackTrace();}}}
wait start...
wait end...
notify start...
notify end...
说明:
在执行wait()或者notify()之前必须先获得该对象的对象级别锁,即:只能在同步方法或者同步块中调用这两个方法。
关键字synchronized可以将任何一个Object对象作为同步对象来看待,而Java为每一个Object都实现了wait()和notify()方法,
他们必须用在被synchronized同步的Object临界区内。通过调用wait()方法可以使处于临界区内的线程进入等待状态,同时释放被同步对象的锁。
而notify操作可以唤醒一个因调用了wait操作而处于阻塞状态的线程,使其进入就绪状态( 注:是就绪状态,而不是运行状态),被唤醒的线程会试图重新获得临界区的控制权,也就是锁,并继续执行临界区内wait之后的代码。
如果发出notify操作时没有处于阻塞状态的线程,那么该命令会被忽略。
wait()方法可以使调用该方法的线程释放该共享资源的锁,然后从运行状态推出,进入等待队列,直到被再次唤醒。
notify()方法可以随机唤醒等待队列中等待该共享资源的“一个”线程,并使该线程退出等待队列,进入可运行状态,也就是notify()方法仅通知"一个"线程。
notifyAll()方法可以使所有正在等待队列中等待该共享资源的“全部”线程从等待状态退出,进入可运行状态。此时优先级最高的那个线程最先执行,但也有可能是随机执行,因为这要取决于JVM虚拟机的实现。
注意:方法notify()被执行后,不会释放锁,必须执行完notify()方法所在的同步synchronized代码块后才会释放锁,这一点需要注意的。
顺便附上线程状态转换图:
- 线程操作wait和notify
- 线程的一些基本操作wait set,wait ,notify,nofifyAll
- Java 线程的 wait()和notify()
- java线程中wait和notify 辨别
- 正确理解线程等待和释放(wait/notify)
- 线程中的wait和notify方法
- [Java] 线程之wait和notify
- 正确理解线程等待和释放(wait/notify)
- java 线程 以及wait()和notify()
- 线程中的wait和notify方法
- 线程的同步 wait和notify
- 14.5 wait和notify方法 停止线程
- 线程obj.wait()和obj.notify()详解.
- JAVA线程同步wait()和notify()讲解
- 线程中的wait和notify方法
- 线程间使用wait和notify通信
- 线程的通讯(wait和notify)
- wait 和 notify 实现线程间通信
- FatJar减肥: 解决SpringBoot jar包太大的问题
- 数据结构——树(1)——二叉堆
- 【web自动化测试-Robotframework-翻页功能之二】
- dubbo源码 学习笔记(五)
- opencv3.0+VS2013+opencv_contrib+cmake3.4.3+win8配置方法
- 线程操作wait和notify
- 5.超强力方法
- Android OpenGL ES 2.0 (七) FramebufferObject(FBO)
- 进程+线程+死锁的相关知识
- 微信扫一扫功能实现
- 点亮细胞41-50
- Redis4.0.2安装
- MySQL数据类型和常用字段属性总结
- 游戏服务器端架构升级之路