Yield方法用于允许其他高优先级线程?

时间:2011-09-08 16:03:41

标签: java multithreading

我对yield方法的需求和用法感到困惑。首先我的问题是,如果我们在runnablestate中有两个不同优先级的线程,jvm是否给予两个线程以循环方式执行的平等机会。或者高优先级线程将被赋予优先权?编辑: - 假设OS是windows XP

现在让我们来制作线程类的方法。 Yield方法使当前正在执行的线程对象暂时暂停并允许其他线程(具有更高优先级或相同优先级)执行。

http://oreilly.com/catalog/expjava/excerpt/index.html给出的一篇文章中给出了If,在任何时候,一个优先级高于当前线程变为可运行的线程,它抢占优先级较低的线程并开始执行哪个是什么产量也在做/

所以从上面的陈述看起来,jvm会自动处理yield。不确定在这里提供额外的yield方法是什么?

4 个答案:

答案 0 :(得分:5)

如果你有绿色线程,那么Thread.yield()是必不可少的,但是从版本1.1开始几乎每个JDK都使用了本机线程。

在大多数应用程序中,线程优先级很少发生。

如果你有足够的空闲CPU,每个可以运行的线程都会运行。操作系统没有理由在有空闲资源时不运行低优先级线程或进程。

如果您的系统在每个核心上接近100%的CPU,则操作系统必须选择每个线程或进程在CPU上运行的时间,并且它可能会优先于低优先级线程上的高优先级线程,(许多操作系统忽略了提示),但其他因素也可能很重要。

但是,此优先级仅扩展到原始CPU。它并不意味着更高优先级的线程获得更多的CPU缓存,主内存,内存带宽,文件缓存,磁盘IO或网络IO。如果这些资源中的任何一个在竞争中,它们都是平等的。

答案 1 :(得分:3)

Thread.yield如何工作是特定于实现的。 有效的Java第二版对此有一些很好的见解,并且已经说明了这一点 “任何依赖于该计划的计划 线程调度程序的正确性或性能很可能是不可移植的。“

在某些实现中,Thread.yield甚至可能不是操作。

答案 2 :(得分:2)

Thread.yield()是一种告诉JVM当前线程暂停其执行的方法,JVM可以允许其他线程使用CPU和其他资源。

无论线程的优先级如何,

Thread.yield()都可以在任何线程实例中使用。产生最高优先级线程会导致JVM允许处于可运行状态的下一个线程使用CPU和其他所需资源,在优先级较低的线程实例的情况下也是如此。

请注意此行“线程也可以在您提供的链接中使用yield()调用”解释收益自愿放弃时间。

答案 3 :(得分:1)

  

首先我的问题是,如果我们在runnablestate中有两个不同优先级的线程,那么jvm是否给予两个线程以循环方式执行的平等机会。高优先级线程将被赋予优先权?

线程调度都不是由os处理的。

在java中,线程优先级不是很直观。在linux上,线程优先级在jvm have no effect by default中设置。

相关问题