[英]What is the difference between setting the priority for the main thread or not?
我有這個問題:
創建並運行一個在屏幕上寫“Hello friends”的線程。 主線程等待它只有500毫秒。 然后在為創建的Thread提供比主線程更低的優先級后再次運行程序。 這一次,主線程應該等待10毫秒。 你注意到了嗎? 為什么?
我想知道Thread.setPriority(n)
第一個代碼和第二個代碼輸出相同的差異
第一個代碼
public class Q2 {
public static void main(String[] args) {
Thread2 myThread = new Thread2();
myThread.start();
System.out.println("main thread");
}
}
class Thread2 extends Thread{
@Override
public void run(){
try {
join(500);
System.out.println("Hello Friends from thread2");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
借調代碼
public class Q2 {
public static void main(String[] args) {
Thread2 myThread = new Thread2();
myThread.start();
System.out.println("main thread");
}
}
class Thread2 extends Thread{
@Override
public void run(){
try {
setPriority(MIN_PRIORITY);
join(500);
System.out.println("Hello Friends from thread2");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
主線程應該等待10毫秒
這不是你的代碼所做的。 join
應該在主線程中,而不是在新創建的線程中:
Thread2 myThread = new Thread2();
myThread.start();
myThread.join(10);
我假設這個練習的整個想法是看到兩個具有不同優先級的線程之間的區別。 為線程賦予較低優先級可能會延遲其計划執行。 當主線程等待新線程完成的較小持續時間時,兩個線程的輸出可以交錯,因為主線程可以在第二線程之前繼續到達System.out
。
Thread
類的文檔解釋了線程優先級是什么:
每個線程都有優先權。 具有較高優先級的線程優先於具有較低優先級的線程執行。
一般來說,不要擴展Thread
,你應該換一個Runnable
。
線程優先級是
它唯一的區別就是當你的機器非常繁忙時,從睡眠中醒來需要更長的時間。 例如,有時不需要說500到501毫秒進行join
,有時可能需要510毫秒。
我該如何使用join方法?
的目的join
是等待另一個線程來完成了一些時間限制。 如果您自己加入,這實際上與Thread.sleep
相同我建議使用Thread.sleep
因為這不會Thread.sleep
感到困惑。
首先,從Thread
的文檔:
此線程最多等待毫秒毫秒。 超時為0意味着永遠等待。
所以當你有兩個Thread
實例時,讓我們說當前的一個和一個新實例,你可以讓當前的線程等待新的實例死掉:
final Thread t = new Thread(() -> System.out.println("Test"));
t.start();
t.join();
所以現在我們當前的線程(創建t
那個)將等待t
死亡,然后繼續。 此方法使異步任務同步 。
現在,調用Thread
join
有什么作用? 嗯,這意味着線程將等待自己死亡。 這與TimeUnit.MILLISECONDS.sleep()
相同。
那么你的代碼實際上做了什么?
好吧, main
調用以下代碼:
Thread2 myThread = new Thread2();
myThread.start();
System.out.println("main thread");
這里沒有任何東西讓main
等待任何東西, main
死亡。
現在你的Thread2
(一個class
可怕名稱)執行以下操作:
setPriority(MIN_PRIORITY);
join(500);
System.out.println("Hello Friends from thread2");
因此它設置了自己的優先級,然后等待500
毫秒自己死亡。 顯然它不會在那個時候死去。 然后打印。
setPriority
在此代碼中setPriority
沒有 還要注意,不要extends Thread
,使用Runnable
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.