您的位置 首页 java

面试官:Java多线程中调用wait() 和 sleep()方法有什么不同

前言:面试中被问到这个问题。

我:①、sleep和wait的实现不一样,②、对待锁的处理不一样。

面试官:那么你具体说说。

我:好,给我张纸和笔,开启超神模式(希望不是真实伤害0.5)

第一点,就是sleep和wait的实现不一样(其实这话好像是废话,但是吧,你只有知道这个,下面才有的说),sleep是Thread的 静态方法 ,如图:

sleep源码

wait是Object的方法,如图:

wait方法源码

解释下,sleep是 线程 的静态方法,是线程用来控制自身流程的,也就是说它会使此线程暂停执行一段时间,把执行机会让给其他的线程。睡眠时间一过,此线程就会自动“苏醒”。而wait方法是Object的方法,他是用于线程之间的通信(注意是线程之间的通信,也就是说他是个中间人),该方法会使当前拥有该对象锁的线程等待,直到其他线程调用了notify、notifyAll或者wait超时才会“苏醒”。这里举个wait例子,看他是否真会卡在那,如图:

wait测试

wait测试结果

没有设置wait超时时间,没有调用notify和notifyAll,当i>3的时候,就执行不下去了。

第二点:对待锁有什么不一样,由于sleep是Thread的静态方法,所以他是不会释放锁的。而wait则不一样,它会释放锁。看代码立马让你明白,首先看下sleep方法,如图:

sleep方法

sleep执行结果

打印的结果能够看得出线程1睡眠了 5s 但是在这5s之前没有释放锁(因为线程2执行了10s),也就是说,在线程1执行完后,线程2才执行的。

wait锁测试

wait锁结果

线程1已经调用了wait,但是线程2还是执行了。如果线程1没有释放锁,那么线程2会一直处在等待状态,然而并没有。所以证明wait是释放锁的。

从代码上相信大家可以理解了吧。

总结:

  1. 他们的实现原理不一样,sleep是线程静态方法,wait是Object方法;
  2. 对锁的处理机制不同,sleep不会释放锁,而wait会释放锁;
  3. 使用区域不用,sleep是哪都能用,wait只能在同步方法或者同步代码块中。

总结的这几点,在我代码中都有体现。大家也可以模拟写一下。

文章来源:智云一二三科技

文章标题:面试官:Java多线程中调用wait() 和 sleep()方法有什么不同

文章地址:https://www.zhihuclub.com/194035.shtml

关于作者: 智云科技

热门文章

评论已关闭

8条评论

  1. Truly loads of helpful facts.
    essay on what can i do for my country pakistan my favorite writer essay in hindi

  2. Many thanks! A lot of write ups!
    essay writers online cheap a website that writes essays for you

网站地图