本文主要是介绍JAVA多线程:sleep、wait、yield、join、notify、notifyAll,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.yield方法和sleep方法的区别
(1)yield方法和sleep方法都能暂停当前线程,sleep可以指定具体的休眠时间,而yield则依赖CPU的时间片划分。
(2)yield和sleep在暂停的过程中,如果已经持有锁,则都不会释放资源所。
(3)yield不能被中断,而sleep则可以接受中断。
2.sleep和wait的5个区别
- 使用限制。sleep可以让当前线程休眠,可以在任何地方调用,需要捕获InterruptedException。wait方法必须放在sychronized块里面,获取对象的锁,同样要捕获interruptedException,wait方法需要手动唤醒。
- 使用场景。sleep一般用于休眠,或者轮询暂停操作。wait则用于多线程之间通信。
- sleep是Thread类的静态本地方法(static native),wait是Object类的本地方法(final native),为什么要这样设计呢?因为sleep是让当前线程休眠,不涉及到对象类,也不需要获取对象的锁,所以是线程类的方法。wait是让获取到对象锁的线程实现等待,前提是获取对象的锁,所以是Object类方法。
- 释放锁。wait会释放当前线程对lock的对象锁,sleep不会。
- 线程切换。sleep会让出CPU执行时间且强制上下文切换,而wait则不一定,wait后可能还会有机会重新竞争到锁继续执行。
3.notify和notifyAll
- notifyAll会让所有处于等待池中的线程全部进入锁池去竞争获取锁的机会。
- notify只会随机选取一个处于等待池中的线程进入锁池去竞争获取锁的机会。notify唤醒的是其所在锁所阻塞的线程, 选择哪个线程取决于操作系统对多线程管理的实现。
这篇关于JAVA多线程:sleep、wait、yield、join、notify、notifyAll的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!