首页 > 试题广场 >

关于sleep()和wait(),以下描述错误的一项是( )

[单选题]
关于sleep()和wait(),以下描述错误的一项是( )
  • sleep是线程类(Thread)的方法,wait是Object类的方法;
  • sleep不释放对象锁,wait放弃对象锁
  • sleep暂停线程、但监控状态仍然保持,结束后会自动恢复
  • wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态
推荐
D
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.每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。 
sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。 
2.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 
3.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常 
4.sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
5.wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。



编辑于 2015-01-19 21:46:19 回复(24)

 Java中sleep和wait的区别

① 这两个方法来自 不同的类 分别是,sleep来自Thread类,和wait来自Object类。

sleep是Thread的静态类方法, 谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉, 要让b线程睡觉要在b的代码中调用sleep。


② 锁:  最主要sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

Thread.sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。

③ 使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

   synchronized(x){ 
      x.notify() 
     //或者wait() 
   }

发表于 2016-08-10 21:37:30 回复(2)
D应该是进入可运行状态吧。
发表于 2015-10-09 09:28:38 回复(0)
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
发表于 2015-10-06 21:44:27 回复(1)
D错是因为进入的是就绪状态而不是运行状态
发表于 2016-04-12 23:34:39 回复(16)
D选项中,wait后,针对此对象发出notify方法后获得对象锁,应该进入的是就绪状态,等cpu分配时间片后,才可以进入运行状态。
发表于 2022-03-25 14:24:08 回复(0)
调用wait()会让当前线程放弃持有的锁,并进入等待状态,直到针对当前对象调用其notify(),会让线程从等待状态变为准备状态,开始尝试获取对象锁,获取成功则进入运行状态。wait()、notify()、notifyAll()都是Object类中的方法,使用时需要放在synchronized修饰的同步代码块中。
发表于 2019-04-09 18:14:27 回复(0)
wait后进入等待锁定池,发出notify()/notifyAll()后进入就绪状态
发表于 2019-03-28 15:15:32 回复(0)

盯着对比了好久,就对比出个notifyAll也可以,没看到其他,这么简单的吗选项


发表于 2018-08-09 09:22:14 回复(0)
对象等待池
发表于 2017-10-30 06:58:04 回复(0)
获得锁之后进入就绪状态而不是运行状态!!!切记切记
发表于 2017-09-27 13:57:39 回复(0)
D项应改为
wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入就绪状态
因为java的多线程是抢占式的,不保证执行顺序
发表于 2017-07-28 11:36:08 回复(0)
获取锁后进入就绪状态,等待获取CPU,获取CPU之后才进入运行状态
发表于 2017-04-27 21:35:16 回复(0)
获取对象锁进入就绪状态,不是直接进入运行状态
发表于 2016-09-07 15:34:21 回复(0)
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
发表于 2016-07-09 18:00:12 回复(0)
是否放弃对象锁
发表于 2014-11-11 00:47:59 回复(0)
D选项,notity()和notifyAll()两个方法均可,应该进入就绪状态而不是运行状态。
发表于 2016-02-29 13:36:12 回复(6)
感觉玩文字游戏
发表于 2015-06-21 11:38:05 回复(0)
答案:D
sleep是线程类(Thread)的方法,执行此方***导致当前此线程暂停指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法或notifyAll后本线程才获得对象锁进入运行状态
发表于 2015-01-18 12:02:38 回复(7)
notify或notiyALL
发表于 2015-08-01 16:09:36 回复(1)
一. 线程状态类型
1. 新建状态(New):新创建了一个线程对象
2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权
3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码
4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
    (一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中
    (二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中
    (三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态
5. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期
 线程状态图
发表于 2016-08-06 14:11:55 回复(3)