Thread的sleep方法和Object的wait方法有什么区别?

答案

  • sleep 方法在调用时,加不加 synchronized 锁是可选的;而要调用某一对象的 wait 方法必须首先获得该对象的 synchronized 锁

  • 如果都使用了 synchronized,那么它们还有以下区别:

Object obj = new Object();
synchronized(obj){
   Thread.sleep(1000);
}

上面代码的含义是,假设有线程t1首先对obj加锁成功,接下来t1 线程睡眠1s,在它睡眠期间,其它线程要 synchronized(obj)对象只能等待t1睡眠结束释放锁

Object obj = new Object();
synchronized(obj){
   Thread.wait(1000);
}

上面代码的含义是,假设有线程t1首先对obj加锁成功,接下来t1 线程进入obj的“休息室”,等待超时或被唤醒。一旦进入等待状态,t1线程会释放锁,因此,其它线程可以继续竞争 synchronized(obj)

追问:中断这两种状态的结果?

答案

当调用 线程对象.interrupt() 时,无论该线程对象是调用了 sleep 睡眠还是 wait 等待,都会导致该线程被抛出 InterruptedException

区别在于使用 wait 方法的一般姿势是:

Thread t1 = new Thread(()->{
  synchronized(obj){
    while(wait条件成立) {
      try {
        obj.wait();
      } catch(InterruptedException e) {
        // 处理
      }
    }
  }
});
t1.start();

假设有线程t1首先对obj加锁成功,并进入wait。如果有其它线程调用了t1.inerrupt(),这时候会让t1线程发生 InterruptedException,但如果catch不改变while 里的等待条件,那么下一轮循环会让t1线程重新进入obj等待。


results matching ""

    No results matching ""