为什么需要yield,因为即使没有调用yield方法,任何线程都可能会进入就绪状态

时间:2019-07-11 17:30:04

标签: java multithreading yield

我正在阅读有关产量的信息。有人告诉我们,如果一个线程运行了很长时间,而另一个线程要运行很短的时间,则需要等待长时间运行的线程来完成其处理。但是我的问题是根据线程调度程序,没有一个线程会一口气完成。它必须在运行状态和就绪状态之间振荡。长时间运行的线程也是如此。最终,它将在一段时间后从运行状态转为就绪状态,然后将恢复工作,并且该循环将一直持续到完成工作为止。那么产量的作用是什么?这是自愿进入就绪状态以查看是否有人需要处理时间的自愿方式吗?

下面是来自https://www.geeksforgeeks.org/java-concurrency-yield-sleep-and-join-methods/的信息,无法清除我的疑问。

yield():假设有三个线程t1,t2和t3。线程t1获取处理器并开始执行,线程t2和t3处于“就绪/可运行”状态。线程t1的完成时间为5小时,线程t2的完成时间为5分钟。由于t1将在5个小时后完成执行,因此t2必须等待5个小时才能完成5分钟的工作。在一个线程花费太多时间来完成其执行的这种情况下,我们需要一种方法来防止在某些重要的未决事件之间执行线程。 yeild()可以帮助我们这样做。 yield()基本上意味着线程没有做任何特别重要的事情,如果需要运行任何其他线程或进程,则应该运行它们。否则,当前线程将继续运行。

1 个答案:

答案 0 :(得分:0)

yield()对Java运行时说:“您现在可以继续使用另一个线程”。对于具有本地线程和抢先式多任务处理的当前操作系统(例如Unix或Windwos),长时间运行的线程最终将暂停一段时间,其他线程将被执行。使用yield()可能会更早发生。

在当前环境中,此功能在大多数情况下并不重要。如果只有协同多任务处理,那么实际上只有一个线程,而只有通过调用yield()明确允许当前进程暂停时,另一个进程才能执行,所以这特别有用。