问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

线程中sleep和wait的区别

发布网友 发布时间:2022-04-20 22:07

我来回答

3个回答

热心网友 时间:2023-07-22 02:13

线程中sleep和wait的区别如下:
一,首先二者的不同点:
1.这两个方法来自不同的类分别是Thread和Object。首先对于sleep()方法,要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
2.sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备。获取对象锁进入运行状态。
3.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
比如:
synchronized(x){
x.notify()
//或者wait()
}
4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
举例说明如下:
1.首先我们先看sleep中的构造函数
sleep(long millis) 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 schelers.
sleep(long millis, int nanos) Causes the currently executing thread to sleep (cease execution) for the specified number of milliseconds plus the specified number of nanoseconds, subject to the precision and accuracy of system timers and schelers.
sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。
另外注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程
2.wait方法
void wait(long timeout)
Causes the current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.
void wait(long timeout, int nanos)
Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object, or some other thread interrupts the current thread, or a certain amount of real time has elapsed.
wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生
InterruptedException,效果以及处理方式同sleep()方法
二,最后二者的共同点:
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 。
以上就是线程中sleep和wait的区别。

热心网友 时间:2023-07-22 02:13

还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.第二种解释:sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行,例如:try{
System.out.println("I'm
going
to
bed");
Thread.sleep(1000);
System.out.println("I
wake
up");}catch(IntrruptedException
e)
{
}wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者,例如://Thread
1try{
obj.wait();//suspend
thread
until
obj.notify()
is
called}catch(InterrputedException
e)
{
}第三种解释:这两者的施加者是有本质区别的.
sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是
"点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制.
而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是
thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线
程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许,
直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处
继续执行.
其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题
在java.lang.Thread类中,提供了sleep(),
而java.lang.Object类中提供了wait(),
notify()和notifyAll()方法来操作线程
sleep()可以将一个线程睡眠,参数可以指定一个时间。
而wait()可以将一个线程挂起,直到超时或者该线程被唤醒。
wait有两种形式wait()和wait(milliseconds).
sleep和wait的区别有:
1,这两个方法来自不同的类分别是Thread和Object
2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

热心网友 时间:2023-07-22 02:14

1、这两个方法来自不同的类分别是Thread和Object

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

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

synchronized(x){

x.notify()

//或者wait()

}

4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
到4s店提新车注意事项和步骤是什么? 看到网吧了电脑桌面是动的,请问要怎么弄才可以把电脑桌面弄动起来~? 大型铸件加工厂家 山东浩信集团企业简介 孕妇梦见板栗什么意思 翻身训练的作用 云南中风偏瘫早期自我康复锻炼 实用偏瘫康复训练技术图解(第二版)详细介绍了哪些站起和站立训练方法... 松树扦插多久生根 松树扦插需要多长时间才能生根 松树扦插多久生根 java中wait方法怎么条用 wait方法和sleep方法的区别 java中wait方法是什么意思 线程中的方法wait(),notify()和notifyAll()的作用... 有哪些地方适合秋游团建? 有哪些火爆全网的网红娱乐项目? 重庆有没有可以拍照的玻璃栈道啊? 微信上这个黑发老师说产品能黑发有人试过吗 是真的吗 什么活动能促进团队集体建设? 前两天在抖音上,看到黄山有一个集装箱民宿,我和... 端午怎么玩? 抖音上的西安摔碗酒是哪里的? 去游乐园该怎么和女朋友玩 重庆有玻璃栈道漂流吗2018 重庆高空漂流在哪里 在抖音上面那种,类似玻璃栈道那样,但是是木头的... 情侣去玩的地方好玩的地方 十渡誓言玻璃栈道怎么样? 抖音里面很火的滑梯游戏叫什么 有哪些因为抖音快速火起来,又快速冷清的景点? 快看VIP赠送20话能分给不同漫画吗 java线程wait方法 java 中sleep()方法或者wait()方法的使用 java里面的wait方法(object类中的)和sleep()方... JAVA中线程同步方法有哪些 java中的sleep和wait的区别 vfp中的wait()作用 wait(0)作用 JAVA中的Wait()和notify()方法使用时应注意些什么? wait和sleep的区别 wait(0)什么意思 和 wait有什么 区别 用来 干什么 的 线程中sleep和wait有什么区别 手机充电会漏电吗? 手机充电的时候漏电怎么办? 苹果11充电会漏电,边框麻手速正常的吗? 手机充电时侧键漏电,怎么回事?? 手机充电为什么会漏电 vivo613 为什么我的苹果手机在充电的时候会漏电 手机充电时漏电危险吗 Iphone4S手机充电时会漏电,这是怎么回事啊? 苹果手机充电的时候都有一些漏电。这种漏电怕吗。