2017-06-18 69 views
1

我在網上讀到螺紋setpriority()可和整個下面傳來:的Java多線程:setpriority()可

final void setPriority(int level) 

這裏,級別指定調用新的優先級設置線。

來源:http://www.java-samples.com/showtutorial.php?tutorialid=302

什麼我不明白是怎麼setpriority()可改變調用線程的優先級:它不應該影響到調用它的對象,被呼叫者?所以如果我從主要(),然後主要()的優先級將被改變?

這是除非我不明白調用線程 ..是什麼意思..。

回答

2

的methid setPriorityThread.javahttps://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#setPriority(int)

優先級定義是有用的提示線程調度來決定優先哪個線程同時分配CPU。默認情況下,主線程啓動一個java程序的執行。開發人員可以創建自定義的Thread.java對象。當這些線程啓動時,由線程的run方法啓動的代碼將在其執行該特定線程的路徑中執行。每個線程都由一個方法調用堆棧支持。主線程的默認優先級爲5.創建的任何線程都提供優先級值,與創建其執行路徑的線程的優先級值相同。

您需要一個可以在其上調用(調用)方法的對象。

當你說「...如果我從main(),...」調用方法時,你是什麼意思?你只是無法調用它沒有任何線程的實例。您可以創建一個線程實例,然後調用其上的方法setPriority。這樣做會設置調用該方法的線程的優先級。

Thread usedDefinedThreadReference = new Thread(); 
usedDefinedThreadReference.setPriority(2); 

上面會創建線程的實例,並設置其優先級等於當前執行的線程,如果它的主線程則默認情況下它的優先級設置爲5

Thread.currentThread().setPriority(6); 

上面將設置當前正在執行的線程的優先級爲6

public static void main(String[] args){ 
    Thread.currentThread().setPriority(7); // currently executing thread is Main thread and its priority is set as 7 from its default value of 5 
    Thread t = new MyThread(); // its priority is set to 7 as current executing thread has priority equal to 7. 

    t.setPriority(3); // priority of Thread object referenced by t is set to 3. 

    Thread.currentThread().setPriority(8); // main thread is currently executing thread hence its priority is set as 8. 

} 

public class MyThread extends Thread { 

    public Thread(){ 
      Thread.currentathread().setPriority(9); // Main thread is currently executing thread hence its priority is set as 9. 
      this.setPriority(8); // this refers to object of MyThread , the current object hence its priority is set as 8 not of main. 
    } 
    public void run(){ 
     Thread.currentThread().setPriority(2); // currently executing thread is MyThread`s object hence its priority is set as 2. 
     this.setPriority(4); // again currently executing thread is Object of MyThread hence its priority is set as 4. 
    } 
} 
+0

我的意思是,如果在main()中實例化一個Thread對象,然後在該對象上調用setPriority(),哪個優先級會改變,我創建的線程還是main()的? – Searcherer

+1

優先級是在線程對象上調用'setPriority'時設置的整數值。它是一個實例方法,所以它影響它所調用的對象。我已經爲你編輯了我的答案。 –

+0

Thx。所以,正如我上面評論的那樣,我在網頁上看到的內容似乎是錯誤的......。 – Searcherer

1

Java中的每段代碼都是從Thread的一個實例中執行的。

如果您不寫自己的線程,則所有內容都將由java-main-thread執行。

當Java虛擬機啓動時,通常會有一個非守護線程(通常會調用某個指定類的main方法)。 (從Thread了Java API)

但是您可以使用多個Thread正穿過你的項目,使多線程和並行技術的使用你的機器上。

方法setPriority可以用來給你調用這個方法的當前線程對象一個優先級。線程調度程序使用您的操作系統的優先級來根據它們的優先級爲線程提供CPU時間。因此,具有更高優先級的線程比具有更小優先級的線程更可能獲得CPU時間。

同樣,如果你不使用任何自制線程,你確實使用java-main-thread。您始終可以通過使用Thread.getCurrentThread()訪問當前的線程。

所以,如果你有自己的Thread類MyOwnThread extends Thread,寫這樣的事:

MyOwnThread myOwnThread = new MyOwnThread(); 
myOwnThread.setPriority(...); 

myOwnThread的優先級的影響。但如果你寫這樣的東西:

public static void main(String[] args) { 
    ... 
    Thread.getCurrentThread().setPriority(...); 
    ... 
} 

您正在影響java-main-thread

+0

很好解釋。 –

+0

嗨,所以我讀的是錯誤的,那麼調用線程的優先級不會受調用setPriority()影響,它是受影響的調用(不是調用)線程的優先級,這可能與如果當前線程正在使用對自身的引用,則調用線程,如上例所示。因此,它基本上是其調用優先級的調用線程對象(調用該方法的對象)。那還是什麼東西仍然在這裏失蹤! – Searcherer

+1

優先級是在類Thread.java中設置的字段。像其他任何類一樣,您可以在對象上調用該方法,然後調用其調用受影響方法的對象。它簡單的'.'運算符規則:'referenceOfObjectA.alterState()'將會改變對象A的狀態。如果這個方法在類A中被調用,那麼'referenceOfObjectA'將被隱式引用'this '。 –

1

真正重要的部分在這裏:優先只有推薦給底層操作系統。

換句話說:在Java中使用線程優先級的結果完全取決於事情JVM版本,操作系統類型,操作系統版本,...

長話短說:依靠它們是浪費時間。因爲機會非常接近於零,所以使用這個概念將導致預期的結果。

[個人觀點:我最近花了幾個小時試圖編寫基於優先級的Java線程來顯示優先級的影響 - 沒有解決;既不適用於Windows,也不適用於Linux]