Sleep()和wait()方法的区别
线程sleep 和wait 的区别:
1、这两个方法来自不同的类分别是Thread和Object
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
4、sleep必须捕获异常,wait,notify和notifyAll同样需要捕获异常(之前看到网上很多博客都说wait方法不需要抛出异常这个观点是错误的,千万不要被误导了!!!!!!!notify和notifyAll方法确实可以不用抛出异常)
不加抛异常处理的会编译通不过
此时运行这个可以看到控制台报错
提示“必须对其进行捕获或声明以便输出”
下面是一个正常的代码
import java.io.File; /** * @author zhouyanxiang * @create 2020-10-2020/10/20-16:00 */ public class Solution { public static void main(String[] args) throws InterruptedException { Thread.sleep(1000); Solution s2 = new Solution(); s2.test(); } public void test() { Object o = new Object(); new Thread(()->{ synchronized (o) { System.out.println("111111"); try { o.wait(); System.out.println("333333"); } catch (InterruptedException e) { e.printStackTrace(); } } },"t1").start(); new Thread(()->{ synchronized (o) { System.out.println("oooooo"); try { o.wait(); System.out.println("xxxxxx"); } catch (InterruptedException e) { e.printStackTrace(); } } },"t3").start(); new Thread(()->{ synchronized (o) { System.out.println("tttttt"); try { o.wait(); System.out.println("ssssss"); } catch (InterruptedException e) { e.printStackTrace(); } } },"t4").start(); new Thread(()->{ synchronized (o) { System.out.println("222222"); o.notifyAll(); System.out.println("444444"); System.out.println("555555"); System.out.println("666666"); System.out.println("777777"); System.out.println("888888"); System.out.println("999999"); } },"t2").start(); } }
最后输出
证明了notifyAll是先唤醒最近正在等待的,依次往上唤醒。
5、sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行。wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者。
共同点:
它们都可以被interrupted方法中断。
Thread.Sleep(1000) 意思是在未来的1000毫秒内本线程不参与CPU竞争,1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。另外值得一提的是Thread.Sleep(0)的作用,就是触发操作系统立刻重新进行一次CPU竞争,竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。
wait(1000)表示将锁释放1000毫秒,到时间后如果锁没有被其他线程占用,则再次得到锁,然后wait方法结束,执行后面的代码,如果锁被其他线程占用,则等待其他线程释放锁。注意,设置了超时时间的wait方法一旦过了超时时间,并不需要其他线程执行notify也能自动解除阻塞,但是如果没设置超时时间的wait方法必须等待其他线程执行notify。
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
从使用角度看,sleep是Thread线程类的方法,而wait是Object顶级类的方法。
sleep可以在任何地方使用,而wait只能在同步方法或者同步块中使用。