sleep方法与wait方法的区别,Java中wait和sleep方法的描述正确的是

  sleep方法与wait方法的区别,Java中wait和sleep方法的描述正确的是

  00-1010区别1:语法使用不同2:分类不同3:唤醒方式不同4:锁资源释放不同睡眠不释放锁等待释放锁区别5:线程入口状态不同摘要前言:

  sleep方法和wait方法都是用来让一个线程进入休眠状态的,sleep和wait方法都可以响应中断,也就是说当一个线程在休眠的过程中,如果收到中断信号就可以响应并中断,都可以抛出InterruptedException。睡觉和等待有什么区别?接下来,我们一起来看看。

  00-1010Wait方法必须与synchronized一起使用,否则将在运行时抛出IllegalMonitorStateException异常,如下代码所示:.

  初看代码好像没啥问题,编译器也没报错,然而当我们运行以上程序时就会发生如下错误:

  而 sleep 可以单独使用,无需配合 synchronized 一起使用。

  00-1010Wait方法属于对象类的方法,而sleep方法属于线程类的方法,如下图所示:.

  00-1010sleep方法必须传递一个超时参数,超时后线程会自动唤醒。但是,wait方法不能传递任何参数。当没有参数传递时,意味着永久睡眠。直到另一个线程调用notify或notifyAll,休眠线程才能被唤醒。这意味着sleep 方法具有主动唤醒功能,而不传递任何参数的 wait 方法只能被动的被唤醒.

  

目录

wait 方法会主动的释放锁,而 sleep 方法则不会.接下来,我们用代码来演示两者的区别。

 

  00-1010 sleep的下一个用途是线程休眠2s,然后尝试获取另一个线程中的公共锁。如果锁可以被获取,就意味着睡眠在睡眠的时候会释放锁,反之亦然,实现代码如下:.

  公共静态void main(String[] args)引发interrupted exception { Object lock=new Object();new thread(()-{ synchronized(lock){ system . out . println(新线程获取锁: local datetime . now()));试试{//hibernate 2s thread . sleep(2000);System.out.println(新线程发布: local datetime . now());} catch(interrupted exception e){ e . printstacktrace();} } }).start();//等待新线程获取锁Thread.sleep(200)先;System.out.println(主线程试图获取锁: local datetime . now());//新线程休眠后,尝试获取锁synchronized(lock){ system . out . println(主线程获取锁: local datetime . now()));} }以上代码的执行结果如下图所示:

  从上面的结果可以看出,在调用sleep之后,在主线程中获取锁的尝试没有成功。只有当sleep执行后锁被释放时,主线程才正常得到锁,这说明sleep在睡眠时不释放锁。

  00-1010接下来,使用相同的

  样的方式,将 sleep 替换成 wait,在线程休眠之后,在另一个线程中尝试获取锁,实现代码如下:

  

public static void main(String[] args) throws InterruptedException { Object lock = new Object(); new Thread(() -> { synchronized (lock) { System.out.println("新线程获取到锁:" + LocalDateTime.now()); try { // 休眠 2s lock.wait(2000); System.out.println("新线程获释放锁:" + LocalDateTime.now()); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); // 等新线程先获得锁 Thread.sleep(200); System.out.println("主线程尝试获取锁:" + LocalDateTime.now()); // 在新线程休眠之后,尝试获取锁 synchronized (lock) { System.out.println("主线程获取到锁:" + LocalDateTime.now()); }}

以上代码的执行结果如下图所示:

 

  

 

  从上述结果可以看出,当调用了 wait 之后,主线程立马尝试获取锁成功了,这就说明 wait 休眠时是释放锁的。

  

 

  

区别五:线程进入状态不同

调用 sleep 方法线程会进入 TIMED_WAITING 有时限等待状态,而调用无参数的 wait 方法,线程会进入 WAITING 无时限等待状态

 

  代码演示:

  

public static void main(String[] args) throws InterruptedException { Object lock = new Object(); Thread t1 = new Thread(() -> { synchronized (lock) { try { // 休眠 2s lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } }); t1.start(); Thread t2 = new Thread(() -> { try { Thread.sleep(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 都可以让线程进入休眠状态,并且它们都可以响应 interrupt 中断,但二者的区别主要体现在:语法使用不同、所属类不同、唤醒方式不同、释放锁不同和线程进入的状态不同。

 

  到此这篇关于java中sleep方法和wait方法的五个区别的文章就介绍到这了,更多相关sleep和wait方法内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

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