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

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

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

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

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

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

629a0e77f713b607d634f418a3ec2e9a.pngsleep源码

wait是Object的方法,如图:

0c9f684da70b5afaec08f52ab4d56839.pngwait方法源码

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

ba10ba819cb73acebee82ba593844f45.pngwait测试

fce243b4398f94a058291866bf5855b5.pngwait测试结果

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

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

e8543cff68f6403011b1062527c717e7.pngsleep方法

4d841790c65f0e3184ab4cd7000f3e2c.pngsleep执行结果

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

9a65a3a3670f45f46f03c61bd6337edc.pngwait锁测试

fd791afecbd9c5ed8047c246dbcbd0d5.pngwait锁结果

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

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

总结:

他们的实现原理不一样,sleep是线程静态方法,wait是Object方法; 对锁的处理机制不同,sleep不会释放锁,而wait会释放锁; 使用区域不用,sleep是哪都能用,wait只能在同步方法或者同步代码块中。总结的这几点,在我代码中都有体现。大家也可以模拟写一下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值