今天给大家讲解一个经典面试题,也是出现频率比较高的面试题“wait()和sleep()的区别”?
我们先来说说sleep()方法。它是Thread中的一个静态方法。可以使用Thread.sleep();进行直接调用,表示让线程处于休眠状态。可以使用在任何线程的代码中,Thread.sleep()写在哪个线程就表示让哪个线程休眠,达到指定的休眠状态后线程自动恢复运行状态。
在Thread中有重载了两个sleep()方法,sheep(long):void 和 sheep(long,int) void,其中使用的最多的是第一个sleep(long);参数表示休眠的毫秒数。
sleep()方法说完之后说一下wait()方法。
wait() 是Object中的方法。调用wait()后会让线程从运行状态变为阻塞状态。
在Object类中提供了wait()的重载方法:
wait()方法会让线程变为阻塞,阻塞的同时会释放锁。所以wait()必须要求被等待的线程持有锁,调用 wait()后会把锁释放,其他线程竞争获取锁。当其他线程竞争获取到锁以后,如果达到某个条件后可以通过notify()唤醒,如果有多个wait的线程,系统判断唤醒其中一个。也可以使用notifyAll全部唤醒。唤醒后线程处于就绪状态。(一个线程唤醒其他线程时,要求当前线程必须持有锁.)
总之:1. 使用wait()和notify() | notifyAll()要求必须有锁。所以wait()、notify()、notifyAll() 都是放入锁的代码中。 2. wait()后的线程需要通过notify() | notifyAll() 唤醒。
通过上面内容小伙伴应该知道了wait()和sleep()的使用方式,下面给小伙伴们分门别类的总结一下wait() 和sleep()的区别:
1. 所属类不同。
wait(long) 是Object中方法,sleep(long)是Thread的方法
2. 唤醒机制不同。
wait() 没有设置最大时间情况下,必须等待notify() | notifyAll() sleep()是到指定时间自动唤醒。
3. 锁机制不同
wait(long)释放锁,sleep(long)只是让线程休眠,不会释放锁。
4. 使用位置不同
wait()必须在持有锁的线程代码中,sleep()可以使用在任意地方。
5. 方法类型不同
wait()是实例方法,sleep()是静态方法。
都看到这里了点一个免费的赞吧!(求求啦)
想要获取大厂面试资料+学习规划,关注我,回复:面试题,获取资料!!!