簡體   English   中英

設置主線程的優先級有什么區別?

[英]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

線程優先級是

  • 只是一個提示,如果您沒有正確的權限,操作系統可以並且確實會忽略它。
  • 只有你沒有空閑的CPU才有意義。 如果你有空閑的CPU,每個想要運行的線程都可以運行。
  • 如果你讓你的線程睡覺真的沒關系。 例如一個加入。

它唯一的區別就是當你的機器非常繁忙時,從睡眠中醒來需要更長的時間。 例如,有時不需要說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毫秒自己死亡。 顯然它不會在那個時候死去。 然后打印。

TL; DR: setPriority在此代碼中setPriority沒有


還要注意,不要extends Thread ,使用Runnable

暫無
暫無

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

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