2011-09-08 40 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和其他所需資源,在較低優先級線程實例的情況下也是如此。

山此行「線程也可以與產量(放棄它的時間自願)所說的」在你所提供的鏈接在產量的解釋。