Java Thread 类相关的几个核心方法

问:简单说说 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 中唤醒时将直接执行处理其他业务逻辑的代码,但这时候可能出现另外一种可能,条件谓词已经不满足处理业务逻辑的条件了,从而出现错误的结果,于是有必要进行再一次判断。

本文参考自 Java 中 Thread 类相关的几个核心方法题目解析

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容