java中sleep方法_Java中sleep方法和wait的详细区别

更新时间:2023-07-01 19:36:35 阅读: 评论:0

java中sleep⽅法_Java中sleep⽅法和wait的详细区别
1、两者的区别
对于sleep()⽅法,我们⾸先要知道该⽅法是属于Thread类中的。⽽wait()⽅法,则是属于Object类中的。
描写山水这两个⽅法来⾃不同的类分别是Thread和Object
最主要是sleep⽅法没有释放锁,⽽wait⽅法释放了锁,使得其他线程可以使⽤同步控制块或者⽅法(锁代码块和⽅法锁)。
wait,notify和notifyAll只能在同步控制⽅法或者同步控制块⾥⾯使⽤,⽽sleep可以在任何地⽅,任何时候被任何线程使⽤(使⽤范围)
sleep必须捕获异常,⽽wait,notify和notifyAll不需要捕获异常
sleep⽅法属于Thread类中⽅法,表⽰让⼀个线程进⼊睡眠状态,等待⼀定的时间之后,⾃动醒来进⼊到可运⾏状态,不会马上进⼊运⾏状态,因为线程调度机制恢复线程的运⾏也需要时间,⼀个线程对象调⽤了sleep⽅法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运⾏。但在调⽤sleep⽅法的过程中有可能被其他对象调⽤它的interrupt(),产⽣InterruptedException异常,如果你
的程序不捕获这个异常,线程就会异常终⽌,进⼊TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执⾏catch语句块(可能还有finally语句块)以及以后的代码。
注意sleep()⽅法是⼀个静态⽅法,也就是说他只对当前对象有效,通过t.sleep()让t对象进⼊sleep,这样的做法是错误的,它只会是使当前线程被sleep ⽽不是t线程
wait属于Object的成员⽅法,⼀旦⼀个对象调⽤了wait⽅法,必须要采⽤notify()和notifyAll()⽅法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调⽤了wait()后,这个线程就会释放它持有的所有同步资源,⽽不限于这个被调⽤了wait()⽅法的对象。wait()⽅法也同样会在wait的过程中有可能被其他对象调⽤interrupt()⽅法⽽产⽣
如果线程A希望⽴即结束线程B,则可以对线程B对应的Thread实例调⽤interrupt⽅法。如果此刻线程B正在wait/sleep/join,则线程B会⽴刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
需要注意的是,InterruptedException是线程⾃⼰从内部抛出的,并不是interrupt()⽅法抛出的。对某⼀线程调⽤interrupt()时,如果该线程正在执⾏普通的代码,那么该线程根本就不会抛出InterruptedException。但是,⼀旦该线程进⼊到wait()/sleep()/join()后,就会⽴刻抛出InterruptedException。
面试邀请waite()和notify()因为会对对象的“锁标志”进⾏操作,所以它们必须在synchronized函数或synchronized block中进⾏调⽤。如果在non-synchronized函数或non-synchronizedblock中进⾏调⽤,虽然能编译通过,但在运⾏时会发⽣illegalMonitorStateException的异常。
补充两个重要的⽅法:yield()和join()痤疮是什么样的
yield⽅法
暂停当前正在执⾏的线程对象。
yield()⽅法是停⽌当前线程,让同等优先权的线程或更⾼优先级的线程有执⾏的机会。如果没有的话,那么yield()⽅法将不会起作⽤,并且由可执⾏状态后马上⼜被执⾏。韩文歌曲
车马坑
join⽅法是⽤于在某⼀个线程的执⾏过程中调⽤另⼀个线程执⾏,等到被调⽤的线程执⾏结束后,再继续执⾏当前线程。如:t.join();//主要⽤于等待t线程运⾏结束,若⽆此句,main则会执⾏完毕,导致结果不可预测。
说⼀下为什么使⽤wait()⽅法时,⼀般是需要while循环⽽不是if?
while(!执⾏条件) {
wait();
}
....
if(!执⾏条件) {
wait();
}兔子十不喂
....
二维码营销while会⼀直执⾏循环,直到条件满⾜,执⾏条件才会继续往下执⾏。if只会执⾏⼀次判断条件,不满⾜就会等待。这样就会出现问题。
小门神
我们知道⽤notify() 和notifyAll()可以唤醒线程,⼀般我们常⽤的是notifyAll(),因为notify(),只会随机唤醒⼀个睡眠线程,并不⼀定是我们想要唤醒的线程。如果使⽤的是notifyAll(),唤醒所有的线程,那你怎么知道他想唤醒的是某个正在等待的wait()线程呢,如果⽤
while()⽅法,就会再次判断条件是不是成⽴,满⾜执⾏条件了,就会接着执⾏,⽽if会直接唤醒wait()⽅法,继续往下执⾏,根本不管这个notifyAll()是不是想唤醒的是⾃⼰还是别⼈,可能此时if的条件根本没成⽴。
举个例⼦:
while去⽔果店买苹果,没有了,然后while就和⽔果店⽼板说,有⽔果的时候通知我,我先回去了。if也去⽔果店买苹果,没有了,然后if就和⽔果店⽼板说,有⽔果的时候通知我,我先回去了。过⼀段时间,⽔果店⽼板发短信告诉while和if,有⽔果了,while去⼀看,⽔果店只是进了⾹蕉,并不是苹果,所以不是想要的⽔果,于是回去继续等⽔果店⽼板通知,⽽if根本就不看是不是⾃⼰想要的苹果,直接就叫⽼板送10⽄⽔果过来,这样会导致你得到错误的结果。

本文发布于:2023-07-01 19:36:35,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1072725.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:线程   果店   不会   对象   条件   可能
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图