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等待。