线程的礼让和加入
1、线程的礼让是一种让当前正在执行的线程主动暂停、并允许其他具有相同优先级的线程获取 CPU 执行权的机制。这种机制可以帮助线程间更公平地共享 CPU 资源,但它并不保证一定会让出执行权。
Thread.yield()
是一个静态方法,用于提示线程调度器当前线程愿意让出 CPU 执行权。但调度器可以选择忽略这个提示。
Thread.yield();
注意事项
- 不保证切换:
yield()
只是建议线程调度器切换线程,但调度器可能忽略这个建议,导致当前线程继续执行。 - 与
sleep()
的区别:yield()
:暂停当前线程,可能立即恢复执行。sleep()
:强制当前线程暂停指定时间,期间不会被调度。
- 优先级影响:如果存在高优先级线程,
yield()
可能无法让低优先级线程获得 CPU。
在操作系统层面,yield()
会使当前线程从 运行状态(Running) 转换为 就绪状态(Runnable),然后重新参与 CPU 竞争。
2、线程的加入(Join) 是一种让一个线程等待另一个线程完成执行的机制。通过 join()
方法,一个线程可以阻塞自己的执行,直到目标线程执行完毕。这在需要确保线程执行顺序或等待其他线程结果的场景中非常有用。
join()
是 Thread
类的实例方法,用于等待调用该方法的线程执行完成。
join()
:无限等待,直到目标线程终止。join(long millis)
:最多等待millis
毫秒,如果超时则不再等待。join(long millis, int nanos)
:更精确的等待时间(毫秒 + 纳秒)。
底层原理
join()
的本质是调用Object.wait()
方法,使当前线程进入等待状态,直到目标线程终止。- 当目标线程终止时,JVM 会自动调用
notifyAll()
唤醒所有等待该线程的其他线程。