问:简单说说 Thread 的 sleep() 和 yield() 方法的区别?
答:它们的主要区别如下:
sleep() 方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;而 yield() 方法只会给相同优先级或更高优先级的线程以运行的机会,甚至可能会是自己继续得到运行机会。
线程执行 sleep() 方法后转入阻塞(blocked)状态,而执行 yield() 方法后转入就绪(ready)状态。
sleep() 方法声明抛出 InterruptedException,而 yield() 方法没有声明任何异常。
sleep() 方法比 yield() 方法(跟操作系统 CPU 调度相关)具有更好的可移植性。
问:简单说说 Thread 的 join() 和 yield() 方法的区别?
答:它们的主要区别如下。
join() 方法的作用是让 “主线程” 等待 “子线程” 结束之后才能继续运行。
yield() 方法的作用是可以暂停当前正在执行的线程对象,让其它有相同优先级或更高的线程执行。它是一个静态方法而且只保证当前线程放弃 CPU 占用而不能保证使其它线程一定能占用 CPU,执行 yield() 的线程有可能在进入到暂停状态后马上又被执行。
问:为什么应该在循环中检查线程的等待条件(如下代码)?
synchronized (monitor) {
// 判断条件谓词是否得到满足
while(!locked) {
// 等待唤醒
monitor.wait();
}
// 处理其他的业务逻辑
}
答:我们一般都会使用如上的 while 判断,而不采用如下的 if 判断:
synchronized (monitor) {
// 判断条件谓词是否得到满足
if(!locked) {
// 等待唤醒
monitor.wait();
}
// 处理其他的业务逻辑
}
这是因为如果采用 if 判断,当线程从 wait 中唤醒时将直接执行处理其他业务逻辑的代码,但这时候可能出现另外一种可能,条件谓词已经不满足处理业务逻辑的条件了,从而出现错误的结果,于是有必要进行再一次判断。