Java线程控制sleep()和wait()有什么区别
Java线程是开发过程中比较重要的一部分,sleep()和wait()都是用来进行线程控制的,单词意思上看起来差不多,但在java开发中的使用方法和意义是有很大不同的。到底java中sleep()和wait()有什么区别?今天就让南京学码思java培训学校老师来给大家详细讲解一下。
1. Java中sleep()和wait()非常大本质的区别是:sleep()不释放同步锁,wait()释放同步缩.
在用法上也有所不同
sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;
wait()可以用notify()直接唤起.
2. 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方法才会重新激活调用者,例如:
try{
obj.wait }
catch(InterrputedException e) {
}
3. sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,
wait()是由某个确定的对象来调用的。
sleep和wait的区别有:
1,这两个方法来自不同的类分别是Thread和Object
2,非常主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
sleep()、suspend()、resume()方法不推荐使用,推荐使用wait()、notify()、notifyAll()。
1.sleep()方法介绍
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非
(a)醒来的线程具有更高的优先级。
(b)正在运行的线程因为其它原因而阻塞。
2.wait()方法介绍
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。当调用wait()后,线程会释放掉它所占有的锁标志,从而使线程所在对象中的其它synchronized数据可被别的线程使用。
3.waite()和notify()的区别
waite()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。
看到这里,相信大家都已经心里有数了。学习java要成体系,但要学好java,还必须要掌握好每个知识点,从细节上学精了,学习才不会出现漏洞,遇到更新更先进的java技术,也能快速掌握。如果你对于java学习还有疑问,或是想获得更多直接java教程和课程资料的话,可以直接咨询学码思在线老师,也欢迎大家前来直接试听学码思java培训课程。