java基础知识回顾之java Thread类学习(九)--wait和notify区别
2023-09-14 08:57:14 时间
wait和sleep区别:
- 相同点:调用wait,sleep方法都可以是线程进入阻塞状态,让出cpu的执行权。
- 不同点:1.sleep必须指定时间,但是wait方法可以指定时间,也可以不指定时间。
2.wait方法必须在同步中使用,但是sleep不一定在同步中使用。
3.在同步中,调用sleep方法释放CPU执行权,但是不会释放锁,即使让出了CPU执行权,其它线程也无法进入同步锁,不能得到执行。但是wait 方法不仅释放CPU执行权,而且释放同步锁,进入阻塞状态。也就是说其它等待此锁的线程可以得到同步锁并运行,阻塞的线程要想再次获得 CPU资格执行必须让其他线程调用notify方法唤醒。
package com.lp.ecjtu.Thread; public class WaitOrSleep { private static class Thread1 implements Runnable{ @Override public void run() {
//由于这里的Thread1和下面的Thread2内部的run方法要用同一个对象作为锁(监视器)
//这里不能用this,因为Thread2里面的this和Thread1里面的this不是同一个对象
//用WaitOrSleep.class这个字节码对象,因为引用的是同一个对象 synchronized(WaitOrSleep.class){ System.out.println("进入线程1----------"); System.out.println("线程1----------wait"); try { WaitOrSleep.class.wait();//释放锁 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("线程1正在运行。。。。。。。。。"); System.out.println("线程1结束"); } } } private static class Thread2 implements Runnable{ @Override public void run() { synchronized(WaitOrSleep.class){ System.out.println("进入线程2----------"); System.out.println("线程2唤醒其它线程。。。。。。"); WaitOrSleep.class.notify();//线程2唤醒其其它线程 //由于notify并不释放锁,让线程2睡10毫秒,因为Sleep方法也不会释放锁,所以线程1不会执行 //等到线程2执行完了,才释放锁,线程1才执行 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程2正在运行。。。。。。。。。"); System.out.println("线程2结束"); } } } /** * @param args */ public static void main(String[] args) { new Thread(new Thread1()).start(); new Thread(new Thread2()).start(); } }
输出结果:
进入线程1----------
线程1----------wait
进入线程2----------
线程2唤醒其它线程。。。。。。
线程2正在运行。。。。。。。。。
线程2结束
线程1正在运行。。。。。。。。。
线程1结束
大家通过本来应该完全明白了其区别。。。。。。。
相关文章
- java基础知识回顾之java Thread类学习(十)--线程的状态以及转化使用的方法介绍
- java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解
- java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)
- java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁
- java基础知识回顾之---java String final类普通方法
- 基础知识《四》---Java多线程学习总结
- JAVA学习(一):Java介绍及其平台、开发环境的配置与搭建
- Java实现 洛谷 P1601 A+B Problem(高精)
- java实现第四届蓝桥杯大臣的旅费
- Java实现二分图的最大权匹配
- 【JAVA秒会技术之秒杀面试官】秒杀Java面试官——集合篇(一)
- Java超类-java.lang.object
- Atitit 搜索蓝牙设备 powershell的实现 java noede.js python 先用脚本语言python nodejs,不好实现。。Java 也不好实现。。 Netcore可以,
- Java 17 VS Java 8: 新旧对决,这些Java 17新特性你不容错过
- java 程序运行的基础知识【Java bytecode】
- Java Logger(java日志)
- 使用Java操作Elasticsearch(Elasticsearch的java api使用)
- Java开发技术之成为高级java工程师必须学习的三个技术
- JAVA开发讲义(一)-Java的自白