资讯专栏INFORMATION COLUMN

Java中wait()与sleep()的区别

seanHai / 1995人阅读

摘要:期间对象锁是释放的调用的时候锁并没有被释放,调用也属于这种情况一般而言,用于线程间的通信,用于线程状态的控制参考资料

  

最近在做面试题的时候看到这道题,复习了一遍《Thinking in Java》,在此记录这个答案

类的区别

wait()来自于 java.lang.Object,任何对象都有此方法

sleep()来自于 java.lang.Thread,调用的对象为线程

用法上的区别

看一下jdk的描述:

  

wait():Causes the current thread to wait until either another thread invokes the
java.lang.Object.notify() method or the java.lang.Object.notifyAll()method for this object, or a specified amount of time has elapsed.

使当前线程挂起,当对象调用java.lang.Object.notify()或者java.lang.Object.notifyAll()或者时间到期,则从wait()中恢复执行

  

sleep():Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers. The thread does not lose ownership of any monitors.

在指定的时间内使当前执行的线程睡眠(暂停执行)

同步与锁的不同

wait()与sleep()最主要的区别就在于同步与锁,wiat()必须放在synchronized block中,否则会在program runtime时扔出java.lang.IllegalMonitorStateException异常。

wait()期间对象锁是释放的

调用sleep()的时候锁并没有被释放,调用yield()也属于这种情况

synchronized(LOCK) {   
    Thread.sleep(1000); // LOCK is held
}

synchronized(LOCK) {   
    LOCK.wait(); // LOCK is not held
}

一般而言,wait()用于线程间的通信,sleep()用于线程状态的控制

参考资料

http://stackoverflow.com/questions/1036754/difference-between-wait-and...
http://howtodoinjava.com/2013/03/08/difference-between-sleep-and-wait/
http://www.qat.com/using-waitnotify-instead-thread-sleep-java/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64300.html

相关文章

  • sleep( ) 和 wait( ) 这 5 个区别,你知道几个?

    摘要:休眠和等待方法是多线程中常用的两个方法,它们有什么区别及一些该注意的地方有哪些呢下面给大家一一分解。区别使用场景一般用于当前线程休眠,或者轮循暂停操作,则多用于多线程之间的通信。 sleep(休眠) 和 wait(等待) 方法是 Java 多线程中常用的两个方法,它们有什么区别及一些该注意的地方有哪些呢?下面给大家一一分解。 区别1:使用限制 使用 sleep 方法可以让让当前线程休眠...

    EscapedDog 评论0 收藏0
  • Java 多线程核心技术梳理(附源码)

    摘要:本文对多线程基础知识进行梳理,主要包括多线程的基本使用,对象及变量的并发访问,线程间通信,的使用,定时器,单例模式,以及线程状态与线程组。源码采用构建,多线程这部分源码位于模块中。通知可能等待该对象的对象锁的其他线程。 本文对多线程基础知识进行梳理,主要包括多线程的基本使用,对象及变量的并发访问,线程间通信,lock的使用,定时器,单例模式,以及线程状态与线程组。 写在前面 花了一周时...

    Winer 评论0 收藏0
  • bat等大公司常考java多线程面试题

    摘要:典型地,和被用在等待另一个线程产生的结果的情形测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用使其恢复。使当前线程放弃当前已经分得的时间,但不使当前线程阻塞,即线程仍处于可执行状态,随时可能再次分得时间。 1、说说进程,线程,协程之间的区别 简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程.进程在执行过程中拥有独立的内存单元...

    Charlie_Jade 评论0 收藏0
  • 一起学并发编程 - sleepwait差异

    摘要:一般差异简单来说,是一个用于线程同步的实例方法。暂停当前线程,不释放任何锁。用来线程间通信,使拥有该对象锁的线程等待直到指定时间或。执行对该对象加的同步代码块。 在JAVA的学习中,不少人会把sleep和wait搞混,认为都是做线程的等待,下面主要介绍下这俩者是什么,及了解它们之间的差异和相似之处。 一般差异 简单来说,wait()是一个用于线程同步的实例方法。因为定义在java.l...

    noONE 评论0 收藏0
  • Thread类源码解读(2)——线程状态及常用方法

    摘要:如果线程还存活,线程就无限期等待,并让出监视器锁,进入状态。当线程从状态被唤醒后通过,或者是假唤醒将继续竞争监视器锁,当成功获得监视器锁后,他将从调用的地方恢复,继续运行。 前言 系列文章目录 上一篇我们讨论了线程的创建,本篇我们来聊一聊线程的状态转换以及常用的几个比较重要的方法。 本篇依然是通过源码分析来了解这些知识。 本文源码基于jdk1.8 。 阅读完本文,你应当有能力回答以...

    luqiuwen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<