wait 和 sleep 的区别

sleep 的源码:java

pub1ic class Thread imp1 ements Runnable {
   //native 表示调用操做系统底层实现的方法 pub1ic static native void sleep(1ong millis) throws InterruptedException ; pub1ic static void s1eep(1ong millis, int nanos) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0|I nanos > 999999) { throw new Il1egalArgumentExcepti on( "nanosecond timeout value out of range"); } if (nanos >= 500000 II (nanos != 0 && millis == 0)) { milliS++; } sleep(mi1lis); } //... }
 
wait 的源码:
public class Object {
    public final native void wait(long timeout) throws InterruptedException;
    public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0) {
            timeout++;
        }

        wait(timeout);
    }
    //...
}
 
区别:
  一、 sleep 来自 Thread 类,和 wait 来自 Object 类。
  二、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其余线程可使用同步控制块或者方法。
  三、wait,notify和 notifyAll 只能在同步控制方法或者同步控制块里面使用,而 sleep 能够在任何地方使用(使用范围)
  四、 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() 方法而产生异常 。
相关文章
相关标签/搜索