1.源码
sleep
//public class Thread implements Runnable{
//...
public static native void sleep(long var0) throws InterruptedException;
public static void sleep(long var0, int var2) throws InterruptedException {
if (var0 < 0L) {
throw new IllegalArgumentException("timeout value is negative");
} else if (var2 >= 0 && var2 <= 999999) {
if (var2 >= 500000 || var2 != 0 && var0 == 0L) {
++var0;
}
sleep(var0);
} else {
throw new IllegalArgumentException("nanosecond timeout value out of range");
}
}
//.,.
//}
sleep(long var0, int var2)这个方法会先进行参数的校验:
1.校验传递的毫秒(var0)是不是 小于0,如果是抛出异常
2.校验传递的纳秒(var2)是不是 大于0且小于999999 如果不是的话也抛出异常,因为1毫秒=1000000纳秒,所以如果超过了999999纳秒,
那就需要使用毫秒来传递.
3.如果纳秒(var2>=500000)的值直接大于了二分之一毫秒(500000),则当前传递的毫秒数直接+1或者(var2!=0&&var0==0)传递的纳秒
不等于0但是传递的毫秒等于0.则直接毫秒数+1.
4,最后调用"sleep(long var0))”这个本地方法完成休眠。
wait
//public class Object {
//...
public final native void wait(long var1) throws InterruptedException;
public final void wait(long var1, int var3) throws InterruptedException {
if (var1 < 0L) {
throw new IllegalArgumentException("timeout value is negative");
} else if (var3 >= 0 && var3 <= 999999) {
if (var3 >= 500000 || var3 != 0 && var1 == 0L) {
++var1;
}
this.wait(var1);
} else {
throw new IllegalArgumentException("nanosecond timeout value out of range");
}
}
//...
//}
wait(long var1, int var3)和sleep(long var0, int var2)这个方法逻辑上相似, var1是毫秒, var3是纳秒
2.概念
1、sleep 来自 Thread 类,和 wait 来自 Object 类。
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait,notify和 notifyAll 只能在同步控制方法或者同步控制块里面使用,而 sleep 可以在任何地方使用(使用范围)
4、sleep 必须捕获异常,而 wait , notify 和 notifyAll 不需要捕获异常
(1) sleep 方法属于 Thread 类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,
因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了 sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程
对象的运行。
但在 sleep 的过程中过程中有可能被其他对象调用它的 interrupt() 产生 InterruptedException 异常,如果你的程序不捕获这个异常,线程
就会异常终止,进入 TERMINATED 状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有 finally 语句块)以及以后的代码。
注意: sleep() 方法是一个静态方法,也就是说他只对当前对象有效,通过 t.sleep() 让t对象进入 sleep ,这样的做法是错误的,它只会是使当前线程被
sleep 而不是 t 线程
(2) wait 属于 Object 的成员方法,一旦一个对象调用了wait方法,必须要采用 notify() 和 notifyAll() 方法唤醒该进程;
如果线程拥有某个或某些对象的同步锁,那么在调用了 wait() 后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了 wait() 方法的对象。
wait() 方法也同样会在 wait 的过程中有可能被其他对象调用 interrupt() 方法而产生 InterruptedException 异常 。