在javadoc中有说yield方法
导致当前正在执行的线程对象暂时暂停并允许其他线程执行。
凯瑟琳·塞拉 (Katherine Sierra) 和伯特·贝茨 (Bert Bates) SCJP 书中说
Yield() 应该做的是
使当前正在运行的线程头回到可运行状态,以允许其他线程
轮到他们的优先顺序相同。
那么方法实际上在做什么呢?
给定一个多线程应用程序,yield
将导致当前正在执行的线程暂停执行并设置为等待状态。然后,JVM 将开始运行之前处于等待状态的另一个线程。
我相信刚刚产生的同一个线程在技术上可以安排重新启动。
不过我还没有在野外看到过这种情况。所以我认为避免是安全的。
详细说明:
在多线程环境中,线程按照 JVM 的意愿进行调度和不调度。因此,即使在代码中没有调用yield,当 JVM 决定应该这样做时,您的线程也可以/将会自动让位于其他线程。这使得多线程可以在只有一个处理核心的环境中工作。
调用yield只是告诉JVM将当前线程置于等待状态,即使JVM不打算这样做。
我将尝试举例说明:
下面是 2 个线程随时间执行的非常简化的说明(假设 1 个核心)-
Thread\Time 1 2 3 4 5 6 7 8 9
Thread 1 ----------- ----- -------
Thread 2 ------- ---------- ------
每当你看到一个'-'
这意味着一个线程正在执行。 A' '
意味着线程正在等待。正如您所看到的,实际上一次只能运行 1 个线程。因此,当 1 运行时,另一个等待。 Yield 的目的是让其他线程有机会先于当前正在运行的线程运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)