簡體   English   中英

設置Java線程的優先級

[英]Setting priority to Java's threads

我有一個程序,運行在幾個線程中。 主線程與其他線程共享一個對象,在main中我有一個調用:

synchronized(obj){
    do stuff
}

我懷疑主線程是飢餓的,並且無法訪問obj 如何提高主線程的優先級或默認情況下它是否已高於其他線程?

Thread類中有一個setPriority()方法。

檢查這個javadoc

將線程優先級設置為最大值

public static void main(String args[]) {
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    // Your main code.
}

該系列文章在這里顯示了一些在各種平台上的線程優先級的管理復雜性。

我想知道你的基本問題是否只是你的工作線程非常占用CPU,因此很少達到他們自然會“放開”處理器的程度(例如通過做一些IO或睡眠。)如果是這樣的話那么你可能會在這些worker中包含對yield()的一些調用,因此給其他Thread更多的機會。

你可以使用setPriority()方法。 例如:

new MyThread("Foo").start(); 
Thread bar = new MyThread("Bar"); 
bar.setPriority( Thread.NORM_PRIORITY + 1 ); 
bar.start();

這給了新的優先權,應該迅速接管Foo

編輯:

要回答您的評論,您可以使用以下方法設置max priortiy:

bar.setPriority( Thread.MAX_PRIORITY );

按照Macarse所說的方式增加主線程的優先級可能會有效。 但是,您依靠平台的搶占式線程調度程序才能正常工作。 您應該在工作線程中使用Thread.yield()靜態方法調用它們運行的​​任何重要代碼段。 即使您使用不同級別的線程優先級,這也是一個很好的習慣。

正如其他人已經回答的那樣,您確實可以為線程設置優先級,如下所示:

Thread.currentThread().setPriority(priority);

但請注意,在您的示例中,線程優先級與線程訪問同步對象的順序無關。 Java使用其他條件來提供訪問權限。 例如參見

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM