本文主要介绍java中sleep方法和wait方法的五个区别。sleep方法和wait方法都用于让线程进入睡眠状态,但是有一些不同。让我们一起来看看它们。
目录
区别1:语法使用不同2:分类不同3:唤醒方式不同4:释放锁资源不同睡眠不释放锁等待释放锁区别5:不同线程入口状态汇总前言:
sleep方法和wait方法都是用来让一个线程进入休眠状态的,sleep和wait方法都可以响应中断,也就是说当一个线程在休眠的过程中,如果收到中断信号就可以响应并中断,都可以抛出InterruptedException。睡觉和等待有什么区别?接下来,我们一起来看看。
区别一:语法使用不同
wait方法必须与synchronized一起使用,否则将在运行时引发IllegalMonitorStateException异常,如下代码所示:。
初看代码好像没啥问题,编译器也没报错,然而当我们运行以上程序时就会发生如下错误:
而 sleep 可以单独使用,无需配合 synchronized 一起使用。
区别二:所属类不同
wait方法属于Object类的方法,sleep方法属于Thread类的方法,如下图所示:。
区别三:唤醒方式不同
sleep方法必须传递一个超时参数,超时后线程会自动唤醒。但是,wait方法不能传递任何参数。当没有参数传递时,意味着永久睡眠。直到另一个线程调用notify或notifyAll,休眠线程才能被唤醒。也就是sleep 方法具有主动唤醒功能,而不传递任何参数的 wait 方法只能被动的被唤醒。
区别四:释放锁资源不同
wait 方法会主动的释放锁,而 sleep 方法则不会。接下来,我们用代码来演示两者的区别。
sleep 不释放锁
接下来,使用sleep意味着线程休眠2s,然后尝试在另一个线程中获取公共锁。如果可以获取锁,说明睡眠时睡眠会释放锁,否则说明不会释放锁,实现代码如下:
公共静态void main(String[] args)引发InterruptedException {
对象锁=新对象();
新线程(()- {
同步(锁定){
System.out.println('新线程获取锁:' local datetime . now());
尝试{
//睡眠2s
线程.睡眠(2000年);
System.out.println('新线程发布:' local datetime . now());
} catch (InterruptedException e) {
e . printstacktrace();
}
}
}).start();
//等待新线程先获得锁。
thread . sleep(200);
System.out.println('主线程试图获取锁:' local datetime . now());
//在新线程进入睡眠状态后,尝试获取锁
同步(锁定){
System.out.println('主线程获取锁:' local datetime . now());
}
}
以上代码的执行结果如下图所示:
从上面的结果可以看出,在调用sleep之后,在主线程中获取锁的尝试没有成功。只有当sleep执行后锁被释放时,主线程才正常得到锁,这说明sleep在睡眠时不释放锁。
wait 释放锁
接下来,用同样的方法,用等待代替睡眠。线程休眠后,尝试在另一个线程实现代码如下:中获取锁。
公共静态void main(String[] args)引发InterruptedException {
对象锁=新对象();
新线程(()- {
同步(锁定){
System.out.println('新线程获取锁:' local datetime . now());
尝试{
//睡眠2s
lock . wait(2000);
System.out.println('新线程发布:' local datetime . now());
} catch (InterruptedException e) {
e . printstacktrace();
}
}
}).start();
//等待新线程先获得锁。
thread . sleep(200);
System.out.println('主线程试图获取锁:' local datetime . now());
//在新线程进入睡眠状态后,尝试获取锁
同步(锁定){
System.out.println('主线程获取锁:' local datetime . now());
}
}
以上代码的执行结果如下图所示:
从上面的结果可以看出,当wait被调用时,主线程立即尝试成功获取锁,也就是说wait休眠时锁被释放。
区别五:线程进入状态不同
调用sleep方法的线程会进入TIMED_WAITING限时等待状态,调用无参数等待方法的线程会进入等待限时等待状态。。
代码演示:
公共静态void main(String[] args)引发InterruptedException {
对象锁=新对象();
线程t1=新线程(()- {
同步(锁定){
尝试{
//睡眠2s
lock . wait();
} catch (InterruptedException e) {
e . printstacktrace();
}
}
});
t1 . start();
线程t2=新线程(()- {
尝试{
线程.睡眠(2000年);
} catch (InterruptedException e) {
e . printstacktrace();
}
});
T2 . start();
thread . sleep(200);
System.out.println('wait())进入状态:' t1 . getstate());
System.out.println('sleep(2000)进入状态:' T2 . getstate());
}
以上代码的执行结果如下:
总结
sleep和wait都可以让一个线程进入休眠状态,都可以响应中断,但是两者的区别主要体现在:语法用法不同,类不同,唤醒方式不同,锁释放不同,线程进入状态不同。
关于java中sleep方法和wait方法的五个区别,本文到此为止。有关睡眠和等待方法的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。