![](/img/trans.png)
[英]Java generics: Does "T2 extends T1" imply "T1 super 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只是使用其運行的操作系統提供的線程庫)。
我關於線程優先級的說明:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.