2011-09-08 54 views
1

我对产量方法的需求和使用感到困惑。首先我的问题是,如果我们在runnablestate中有两个不同优先级的线程,那么jvm是否给予两个线程以循环方式执行的同等机会,或者高优先级的线程将优先?编辑: - 假设OS是windows XP。Yield Method用于允许其他高优先级的线程?

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

http://oreilly.com/catalog/expjava/excerpt/index.html处给出的一篇文章中,如果在任何时候给出一个比当前线程更高优先级的线程变为可运行的,它将抢占较低优先级的线程并开始执行,这也是yield做/

所以看起来像从上面的语句产量是由jvm自动照顾。不确定什么产量方法提供额外的在这里?我所有的问题

回答

4

如果您有绿色线程,则Thread.yield()是必不可少的,但几乎每个版本1.1以后的JDK都使用了本机线程。

线程优先级在大多数应用程序中很少重要。

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

如果您的系统在每个内核上接近CPU的100%,那么操作系统必须选择每个线程或进程在CPU上的时间,并且可能会优先考虑优先级较低的线程而不是较低的优先级线程(许​​多操作系统忽略提示),但其他因素也很重要。

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

+0

感谢彼得伟大的回答。我对产量方法的理解是: - 产量的目的是为了节省一个不太重要的线程/操作的CPU周期,以便它可以用于高优先级的进程。 –

+0

理论上是的,但是它唯一有用的是,如果另一个线程等待在CPU中轮流(因为没有CPU空闲)。如果你不这样做,另一个线程可能会在几微秒内切换。 –

1

首先是,如果我们在runnablestate两个纱线不同的优先级并JVM给予平等的机会,以两个线程在一个循环的方式.OR高优先级的线程执行将被优先考虑?

无论如何,线程调度都是由os处理的。

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

+0

假设操作系统是Windows XP。 –

3

Thread.yield如何工作是特定于实现的。 Effective Java 2nd Edition对此有一些很好的见解,并且声明 “任何依赖于线程调度器的正确性或性能的程序都可能是不可移植的。”

在某些实现中,Thread.yield甚至可能不适用。

+0

感谢您的回答。如果我们在runnablestate中有两个不同优先级的线程,那么jvm会给予两个线程以循环方式执行的同等机会.OR高优先级的线程将会是给予优先。第二点是根据java doc,它看起来像yield的目的是为了保存一个不太重要的线程的cpu周期,以便它可以用于高优先级的进程。尽管它依赖于操作系统。 –

2

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

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

山此行“线程也可以与产量(放弃它的时间自愿)所说的”在你所提供的链接在产量的解释。