目录

sleep()方法:

功能:

使用场合:

注意:

wait()方法

功能:

使用场合:

注意:

代码示例


sleep()方法:

功能:

sleep()方法是Thread类的方法,线程通过调用该方法,进入休眠状态主动让出CPU,从而CPU可以执行其他的线程。经过sleep指定的时间后,CPU回到这个线程上继续往下执行。

如何当前线程进入了同步锁,sleep()方法并不会释放锁。即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。

使用场合:

线程的调度执行是按照其优先级的高低顺序进行的,当高级别的线程未死亡时,低级别的线程没有机会获得CPU资源。有时优先级高的线程需要优先级低的线程完成一些辅助工作或者优先级高的线程需要完成一些比较费时的工作,此时优先级高的线程应该让出CPU资源,使得优先级低的线程有机会执行。为了达到这个目的,优先级高的线程可以在自己的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间。

注意:

如果线程在休眠时被打断,JVM就会抛出InterruptedException异常。因此,必须在try-catch语句块中调用sleep方法。

wait()方法

功能:

wait()方法可以中断线程的运行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。其他线程如果在使用这个同步方法时不需要等待,那么它使用完这个方法的同时,应该用notifyAll()方法通知所有由于使用了这个同步方法而处于等待的线程结束等待,曾中断的线程就会从刚才中断处继续执行这个同步方法(并不是立马执行,而是结束等待),并遵循“先中断先继续”的原则。

wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果)

使用场合:

当一个线程使用的同步方法中用到某个变量,而此变量又需要起亚线程修改后才能符合本线程的需要,那么可以在同步方法中使用wait()方法。

注意:

wait()、notify()和notifyAll()都是Object类的final方法,被所有的类继承且不允许重写的方法。特别需要注意的是,不可以在非同步方法中使用上述三个方法。(从功能和使用场合也可以看出)

代码示例

package thread;public class MultiThread {public static void main(String[] args) throws InterruptedException {new Thread(new Thread1()).start();Thread.sleep(5000);//主动让出CPU,让CPU去执行其他的线程。在sleep指定的时间后,CPU回到这个线程上继续往下执行new Thread(new Thread2()).start();}
}class Thread1 implements Runnable{@Overridepublic void run() {synchronized (MultiThread.class){System.out.println("进入线程1");try{System.out.println("线程1正在等待");Thread.sleep(5000);
//                  MultiThread.class.wait();//wait是指一个已经进入同步锁的线程内(此处指Thread1),让自己暂时让出同步锁,//以便其他在等待此锁的线程(此处指Thread2)可以得到同步锁并运行。}catch(Exception e){System.out.println(e.getMessage());e.printStackTrace();}System.out.println("线程1结束等待,继续执行");System.out.println("线程1执行结束");}}}class Thread2 implements Runnable{@Overridepublic void run() {synchronized (MultiThread.class){System.out.println("进入线程2");System.out.println("线程2唤醒其他线程");MultiThread.class.notify();//Thread2调用了notify()方法,但该方法不会释放对象锁,只是告诉调用wait方法的线程可以去//参与获得锁的竞争了。但不会马上得到锁,因为锁还在别人手里,别人还没有释放。如果notify()//后面的代码还有很多,需要执行完这些代码才会释放锁。try {Thread.sleep(5000);}catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程2继续执行");System.out.println("线程2执行结束");}}}

sleep()和wait()方法有什么区别相关推荐

  1. Pandas中map,applymap和apply方法之间的区别

    本文翻译自:Difference between map, applymap and apply methods in Pandas Can you tell me when to use these ...

  2. Java中方法重载和方法重写的区别

    文章目录 1 Java中方法重载和方法重写的区别 1 Java中方法重载和方法重写的区别 主要区别如下: 方法重载: 在同一个类中 方法名相同 参数个数.顺序.类型不同 返回值类型.访问修饰符任意 方 ...

  3. python中str和int区别_Python中的string方法和str方法有什么区别?

    String是一个模块,str是一个类型. 我发现str有方法,有些str的方法与string相同.在>>>dir(str) ['__add__', '__class__', '__ ...

  4. [label][转载][JavaSript]querySelectorAll 方法相比 getElementsBy 系列方法有什么区别?

     轉載出處: http://www.zhihu.com/question/24702250 querySelectorAll 相比下面这些方法有什么区别? getElementsByTagName g ...

  5. Python中abs()和fabs()方法之间的区别

    In python, abs() method and fabs() method both are used to find the absolute value of a number. They ...

  6. [jQuery] jQuery的attr和prop方法有什么区别?

    [jQuery] jQuery的attr和prop方法有什么区别? 一.property 固有属性. 打开控制台审查元素 切换Tab至 Properties下 查看固有属性二.自定义属性(固有属性列表 ...

  7. Java易混小知识——equals方法和==的区别

    一.equals方法和==的区别 1.equals是String对象的方法,可以通过"."调用. 2.== 是一个运算符. 二.常用的比较用法 1.基本数据类型比较. equals ...

  8. hibernate中get方法和load方法的根本区别

    hibernate中get方法和load方法的根本区别 如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来 ...

  9. JavaScript的call,apply和bind方法之间的区别

    by Rajat Saxena 通过拉贾特·萨克森纳(Rajat Saxena) JavaScript的call,apply和bind方法之间的区别 (The difference between J ...

  10. python函数与方法的区别_python中函数和方法有哪些区别

    python中函数和方法有哪些区别 发布时间:2020-11-16 09:30:04 来源:亿速云 阅读:89 作者:小新 小编给大家分享一下python中函数和方法有哪些区别,相信大部分人都还不怎么 ...

最新文章

  1. 子查询二(在HAVING子句中使用子查询)
  2. 数字字符串转化为字母组合的种数
  3. 如何让 Mybatis 自动生成代码
  4. 工商银行:IT新架构及银行IT架构转型思考
  5. python语言的类型是_Python语言类型
  6. 开发者应该了解的API技术清单!
  7. 不懂 ZooKeeper?没关系,这一篇给你讲的明明白白
  8. php学习笔记0001 变量作用域
  9. 【英语学习】【WOTD】mettlesome 释义/词源/示例
  10. Linux环境SOCKET编程2:epoll分析
  11. OpenCV-Python实战(12)——一文详解AR增强现实
  12. 【最大连接数】Linux的文件最大连接数
  13. 最新服务器CPUe5,看这里!2019 至强 Xeon E5 服务器系列 CPU 天梯图分享
  14. 狗年出生的宝宝取名都有哪些注意事项呢?起名真不是简单事
  15. niosII处理器与串行D/A转换器接口设计
  16. linux运维经验总结
  17. 浩子CHS工作室成立
  18. transformer中的位置嵌入
  19. C# 火星文转化 算法 dictionary 的使用案例
  20. 游戏服务器引擎的设计(一)介绍游戏服务器部署框架

热门文章

  1. 树莓派Pi Pico套件 MicroPython编程
  2. SECS/GEM:PLC与MES间解决方案
  3. android webservice 传递对象,Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍...
  4. STM32MP153 Ubuntu系统移植到ST的STM32MP157-DK2记录
  5. 使用AVPlayer实现在线音频播放注意问题
  6. 电影《异形》标志性雕塑将分割为500个NFT出售
  7. 基于YOLOv8模型+CnOCR识别技术实现汽车车牌识别
  8. 【转载】Concent-Type大全
  9. WeChall Towers of Hanoi (Java, Crac... 答案
  10. 如何利用image transport进行视频压缩传输