sleep()方法和wait()方法的区别
1、来源不同:
sleep()方法来自于 Thread 类的一个静态方法, 只有继承了线程类的子类才能调用该方法,且谁调用的谁去睡觉,即使在 A 线程里调用了 B 的sleep方法,实际上还是 A 去睡觉,要让 B 线程睡觉要在 B 的代码中调用sleep。
1 static void sleep(long millis); //在指定的毫秒数内对当前正在执行的线程进行休眠操作 2 static void sleep(long millis, int nanos); //在指定的毫秒加纳秒内对当前执行线程进行休眠操作
wait()方法来自于 Object 类,Object类所有Java类的祖先。所以任何一个类都可以调用wait()方法。
1 void wait(); //在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待 2 void wait(long timeout); //在其他线程调用此对象的notify()方法或notifyAll()方法,或者超过指定的时间量前,导致该线程等待
3 void wait(long timeout, int nanos); //在其他线程对用此对象的notify()方法或notifyAll()方法,或者其他某个线程终端当前线程,或者已超出某个实际时间量前,当前线程等待
2、最主要是sleep()方法没有释放锁,而 wait() 方法释放了锁,使得其他线程可以使用同步控制块或者方法。就如同蹲坑,就算在马桶上睡着了也不让出这个坑,你睡醒了还可以继续,这就是sleep();拉到一半被boss换出去,让出资源,这就是wait(),决定你再次蹲上这个坑的是boss的唤醒。
所以通常可以描述为 sleep 不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用 notify/notifyAll 唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。 sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
3、使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
synchronized(x){ x.notify(); //或者wait() }
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常