sleep()和wait()有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sleep()和wait()有啥区别相关的知识,希望对你有一定的参考价值。

sleep()不是放锁,而wait()是释放的。
通俗的说,sleep()就是睡眠一段时间后自动醒来。
而wait()则是等待,直到有线程通知(notify())唤醒他才会重新工作。

就好比你睡觉,早上自然就行了,然后就去上班/上学了。
而和朋友出去玩,约好不见不散,你早到了,就会一直等,一直到你朋友来了告诉你“我来了”,然后你才会继续执行接下来的事情。

呵呵
参考技术A 您好:
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源,
sleep是静态方法,是谁掉的谁去睡觉,就算是在main线程里调用了线程b的sleep方法,实际上还是main去睡觉,想让线程b去睡觉要在b的代码中掉sleep
-----------------------------------
如有疑问欢迎追问!
满意请点击右上方【选为满意回答】按钮
参考技术B 回答

亲亲,您的问题我收到了哦,查询资料和打字需要一些时间,请您耐心等待哦。

您好,sleep和wait方法区别如下:①原理不同-sleep()是属于Thread类中的,而wait()方法,则是属于Object类中的。②锁处理机制同-sleep()最主要作用使线程暂停执行一段时间,时间一到自动恢复,不涉及线程通讯,因此,调用sleep()方法并不会释放锁。而当调用wait()方法的时候,线程会释放它所占的锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。③使用区域不同-wait()方法必须放在同步代码块或者同步方法中使用,sleep()可以用在任何地方。

[微笑]

参考技术C

sleep()是线程类Thread的方法;作用是导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时候会自动恢复;调用sleep()不会释放对象锁。

wait()Object类的方法;对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池。只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池,准备获得对象锁进行运行状态。

参考技术D 举个很简单的例子给楼主:

两个人(A,B)都在(等待)看电影

A(sleep) 等待的时候不会把座位让给别人

B(wait) 也在等待但是它可以把座位让给别人自己站着

也就是说A等待的时候不给把资源交给别人..

而B等待的时候可以把资源交给别人...

就这样.....

浅显易懂...

祝楼主早日成功!!

sleep()和wait()的区别

一、sleep()和wait()的区别

1、相同点

  • sleep()和wait()都可以暂停线程的执行。

2、不同点

  • 所在类不同
    sleep()是Thread类的静态方法。
    wait()是Object类的方法。

  • 锁释放不同
    sleep()是不释放锁的。
    wait()是释放锁的。

  • 用途不同
    sleep()常用于一定时间内暂停线程执行。
    wait()常用于线程间交互和通信。

  • 用法不同
    sleep()方法睡眠指定时间之后,线程会自动苏醒。
    wait()方法被调用后,可以通过notify()或notifyAll()来唤醒wait的线程。

二、使用wait(),notify(),notifyAll()的注意事项

  • 当一个线程需要调用对象的wait0方法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的notify()方法。
  • 同样的,当—个线程需要调用对象的 notity()方法之前,也要先获得对象锁,执行完毕后,释放这个对象的锁,以便其他在等待的线程就可以得到这个对象锁。由于所有的这些方法都需要线程持有对象的锁,这样就只能通过同步来实现,所以他们只能在同步方法或者同步块中被调用。

三、wait()和notify()的工作原理

  • 如果线程A1,A2,A3,A4都调用了obj.wait()方法,那么它们就会进入obj对象的等待队列。当obj.notify()被调用的时候,会从等待队列中随机选择一个线程并将其唤醒。而如果调用obj.notifyAll(),则会唤醒等待队列中的所有等待线程。如下图所示:

以上是关于sleep()和wait()有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

selenium.wait()、selenium.wait(2000) 和 Thread.sleep(2000) 有啥区别? [复制]

java中yeild()方发,wait()方法和sleep()有啥区别

sleep与 wait区别

使用Timer和sleep有啥区别

timeunit的sleep和thread的sleep有啥区别

线程中wait 和sleep 的区别