![](https://cdn-r.oss-cn-hangzhou.aliyuncs.com/pro/image/PC/dailyTopic_icon_01.png)
![](https://cdn-r.oss-cn-hangzhou.aliyuncs.com/pro/image/PC/wenna-hot.png)
扫码关注公众号
线程的sleep()方法和yield()方法有什么区别?
①sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;②线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;③sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;④sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。
关于sleep()和wait(),以下描述错误的一项是()
正确答案是D分析:针对此对象的notify方法后获取对象锁并进入就绪状态,而不是运行状态。另外针对此对象的notifyAll方法后也可能获取对象锁并进入就绪状态,而不是运行状态。
以下锁机机制中,不能保证线程安全的是()
正确答案是C当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
既然 start() 方法会调用 run() 方法,为什么我们调用 start() 方法,而不直接调用 run() 方法?
这是一个基本的Java多线程面试题。一般在Java中级面试的电话面试或一轮面试中遇到。这道问题的答案是这样的:当你调用start()方法时,它会新建一个线程然后执行run()方法中的代码。如果直接调用run()方法,并不会创建新线程,方法中的代码会在当前调用者的线程中执行。