1. wait和sleep区别
- 相同点:一旦执行方法,都可以使得当前线程进入阻塞状态
- sleep()方法是线程类(Thread)的静态方法,wait()方法是Object类里的方法。
- sleep是线程类的方法,wait是Object类的方法。
- sleep()可以在任何需要的场景下调用。wait必须使用在同步代码块中
- 如果两个方法都在同步代码块或同步方法中,sleep不会释放锁,wait会释放锁
- sleep()必须捕获异常,wait()方法、notify()方法和notiftAll()方法不需要捕获异常。
- sleep方法必须传入参数,wait可以传也可以不传。
2. sleep和yield方法的区别
- sleep方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级;但yield方法只会给优先级相同或更高的线程执行机会。
- sleep方法会将线程转入阻塞状态,在这期间线程调度器不会去调度该线程,直到经过阻塞时间才会转入就绪状态;调用 yield 方法时,线程只是让出自己剩余的时间片,并没有被阻塞挂起,而是处于就绪状态,线程调度器下一次调度依然有可能调度到此线程执行。
- sleep方法声明抛出了InterruptedException中断异常,所以调用sleep方法时需要捕捉该异常;而yield方法没有声明抛出任何异常。
- sleep方法比yield方法有更好的移植性,通常不建议使用yield方法来控制并发线程的执行。
3. notify和notifyAll的区别
- notify只会随机唤醒一个处于等待队列中的线程;
- notifyAll会唤醒所有等待队列中的线程。
3. 调用对象的wait()方法为什么需要先加锁?
如果不加锁,可能导致notify()在wait()执行之前执行。会使线程一直处于等待状态。