sleep() 和 wait() 有什么区别啊?

解决方案 »

  1.   

    sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级;(b)正在运行的线程因为其它原因而阻塞。 
    wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
      

  2.   

    sleep是Thread类中的一个静态方法,其作用是将当前运行线程暂停设定的时间后,将其转入线程等待池中。
       wait是从Object类中继承的一个非静态方法,由于wait方法是final的,其不可以被覆盖。其作用是将对象所在线程转入休眠状态,直到另一线程调用其notify()或notifyAll()方法,将其转入线程等待池中。
      

  3.   

    两者是两种完全不同的线程间调度方式。sleep 是当前线程主动要求休眠一段时间,这样其他的线程就有可能执行了。但当前线程的复活不依赖于其他线程。wait 是一种更复杂的调度方式,是基于事件的,它是在两个或多个相关的线程之间进行协调的一种线程调度方式,也就是说最少要有两个相关的线程。sun 举的一个例子是出租车司机和乘客,他们代表两个线程,首先,司机停止下来开始打盹(wait),乘客来了唤醒司机(notify),然后乘客开始打盹(wait),司机开车至目的地再唤醒乘客(notify),然后司机又开始打盹(wait)……
      

  4.   

    public final void wait()
                    throws InterruptedException导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。换句话说,此方法的行为就好像它仅执行 wait(0) 调用一样。 
    当前的线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。 对于某一个参数的版本,实现中断和虚假唤醒是可能的,而且此方法应始终在循环中使用: synchronized (obj) {
    while (<condition does not hold>)
    obj.wait();
    ... // Perform action appropriate to condition
         }
      

  5.   

    public static void sleep(long millis)
                      throws InterruptedException
    在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。该线程不丢失任何监视器的所属权。时间一到程序继续运行。
      

  6.   

    sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 
    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 
      

  7.   

    notify方法能够针对具体对象吗?印象中好像是由jvm来决定的吧?
      

  8.   

    说的不够明白,应该是调用 notify() 方法解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中随机选取的,无法预料哪一个线程将会被选择.