,,java中sleep方法和wait方法的五个区别

,,java中sleep方法和wait方法的五个区别

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: