Java线程中sleep和wait的区别详细介绍

 更新时间:2012年11月14日 11:07:32   作者:  
Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行
Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行。
共同点
1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。
如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。
不同点
1.Thread类的方法:sleep(),yield()等
Object的方法:wait()和notify()等
2.每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。
sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
线程的调度
线程调度器按线程的优先级高低选择高优先级线程(进入运行中状态)执行,同时线程调度是抢先式调度,即如果在当前线程执行过程中,一个更高优先级的线程进入可运行状态,则这个线程立即被调度执行。
抢先式调度又分为:时间片方式和独占方式。在时间片方式下,当前活动线程执行完当前时间片后,如果有其他处于就绪状态的相同优先级的线程,系统会将执行权交给其他就绪态的同优先级线程;当前活动线程转入等待执行队列,等待下一个时间片的调度。
在独占方式下,当前活动线程一旦获得执行权,将一直执行下去,直到执行完毕或由于某种原因主动放弃CPU,或者是有一高优先级的线程处于就绪状态。
举例说明
首先我想说的是:在多线程编程中,经常会使用sleep与wait操作,我们理解sleep与wait的最大区别是sleep等待是不会释放当前锁,而wait则反之。我今天想到一个现实例子来比较这两者的区别。
我以去火车站买票的例子来说明。我们去火车站买票,当站到售票窗口前要告诉售票员需要到哪里的票,什么时候发车的,售票员就通过电脑去给我们打印票,这个时候我们就得等待。如果我们用sleep模式,就得一直站在那里等,直到售票员给我们票;如果用wait模式,这个时候就离开我们所站的位置,后面的票友就可能站到我当前的位置(窗口前),我们要取票的话,就得重新排在队伍后面去取票。

相关文章

  • IDEA中Maven依赖下载失败的完美解决方案

    IDEA中Maven依赖下载失败的完美解决方案

    使用IDEA进行Maven项目开发时,时不时会遇到pom.xml报错的情况,其中很大概率是因为Maven依赖的jar包下载失败,找来找去也没有找到是什么问题,困扰了很多程序猿,这里给出IDEA中Maven依赖下载失败解决方案,给大家参考,实测有用
    2020-04-04
  • Spring中的JdbcTemplate详细解析

    Spring中的JdbcTemplate详细解析

    这篇文章主要介绍了Spring中的JdbcTemplate详细解析,JdbcTemplate是Spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装,Spring框架为我们提供了很多的操作模板类,需要的朋友可以参考下
    2024-01-01
  • JavaFX实现UI美观效果代码实例

    JavaFX实现UI美观效果代码实例

    这篇文章主要介绍了JavaFX实现UI美观效果代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Struts2学习教程之拦截器机制与自定义拦截器

    Struts2学习教程之拦截器机制与自定义拦截器

    这篇文章主要给大家介绍了关于Struts2学习基础教程之拦截器机制与自定义拦截器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • 解决bufferedReader.readLine()读到最后发生阻塞的问题

    解决bufferedReader.readLine()读到最后发生阻塞的问题

    这篇文章主要介绍了解决bufferedReader.readLine()读到最后发生阻塞的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java实现通过时间获取8位验证码

    Java实现通过时间获取8位验证码

    这篇文章主要为大家详细介绍了Java如何通过时间获取8位验证码(每两个小时生成一个),文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • maven中resource配置使用详解

    maven中resource配置使用详解

    这篇文章主要介绍了maven中resource配置使用,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 在Java项目中实现日志输出的技巧分享

    在Java项目中实现日志输出的技巧分享

    日志是开发过程中不可或缺的一部分,它可以帮助我们追踪代码的执行过程、排查问题以及监控系统运行状况,然而,大多数开发人员在编写日志时往往只关注于输出必要的信息,而忽略了日志的可读性和美观性,本文将介绍如何在Java项目中实现漂亮的日志输出
    2023-10-10
  • 图书管理系统java版

    图书管理系统java版

    这篇文章主要为大家详细介绍了java版的图书管理系统,通过实例为大家快速掌握数据库编程技术,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 实例分析java对象中浅克隆和深克隆

    实例分析java对象中浅克隆和深克隆

    在本篇文章中我们给大家分享了关于java对象中浅克隆和深克隆的相关知识点和相关代码内容,有兴趣的朋友们学习下。
    2018-10-10

最新评论