簡體   English   中英

Java多線程優先級:為什么在此示例中,即使t2具有更高的優先級,有時t1也會在t2完成之前發生?

[英]Java Multithreading priority: Why in this example, sometimes t1 occurs before t2 is completed, even if t2 has higher priority?

例:

class MyThread extends Thread{  
public MyThread(String name) {
    super(name);
}

public void run(){
    for (int i=0; i<5; i++) {
        System.out.println(Thread.currentThread().getName()
                +"("+Thread.currentThread().getPriority()+ ")"
                +", loop "+i);
    }
} 
}; 

public class Demo {  
    public static void main(String[] args) {  

    System.out.println(Thread.currentThread().getName()
            +"("+Thread.currentThread().getPriority()+ ")");

    Thread t1=new MyThread("t1");    // t1
    Thread t2=new MyThread("t2");    // t2
    t1.setPriority(1);                // t1 priority 1
    t2.setPriority(10);                //t2 priority 10
    t1.start();                        // start t1
    t2.start();                        // start t2
}  
}

當我執行程序時,有時我的輸出如下:

//Output1
main(5)
t2(10), loop 0
t2(10), loop 1
t2(10), loop 2
t2(10), loop 3
t2(10), loop 4
t1(1), loop 0
t1(1), loop 1
t1(1), loop 2
t1(1), loop 3
t1(1), loop 4

有時我的輸出如下:

//Output2
main(5)
t1(1), loop 0
t1(1), loop 1
t1(1), loop 2
t1(1), loop 3
t1(1), loop 4
t2(10), loop 0
t2(10), loop 1
t2(10), loop 2
t2(10), loop 3
t2(10), loop 4 

在其他一些情況下,我會輸出t1首先開始,而t2在t1完成所有輸出之前開始的輸出。

我認為output1更有意義,因為“優先級較高的線程優先於優先級較低的線程執行。”我們如何理解此示例背后的原因?

優先級較低的線程首先啟動,因此在某些情況下甚至可能在優先級較高的線程啟動之前完成。 5次迭代並不多。 在我的(Windows)機器上,如果將迭代次數替換為100,則始終優先選擇優先級更高的線程。

正如您在帖子中已經提到的:

“優先級較高的線程優先於優先級較低的線程執行。”

這確實意味着,與低優先級的線程相比,具有較高優先級的線程被執行的可能性更高。 這並不意味着優先級更高的線程將始終先執行/先執行。 實際的線程處理取決於操作系統(java只是使用其運行的操作系統提供的線程庫)。

我關於線程優先級的說明:

  • 您可以使用它來提高性能
  • 優先級取決於OS(Windows有7個,Linux忽略它們)
  • 不要以正確的工作取決於優先級的方式設計應用
  • 如果有一些高優先級的線程從未被停用,那么低優先級的線程將永遠無法運行

暫無
暫無

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

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