2017-12-03 8 views
0

マイコード出力は以下の通りである: -のJavaマルチスレッドの優先関係

私の質問メインスレッドとスレッドT4の優先度が9であることがあり、スレッドTのそれはなぜライン5 1から4(出力でマークされている)が5行目より前に来る、すなわちt.start()が優先度9を持つメインスレッドによって実行されるt4.start()よりも優先される理由を示します。

メインスレッドの優先度は9です最初にt4.start()が実行されるはずですが、なぜt.start()が最初に実行されるのですか?

私はstartメソッドを呼び出す順序を逆にすると、つまり、t4.start()とt.start()の順で呼び出した場合、出力は期待どおりです。

出力

5 

5 

Main Thread Priority :9 

5 

Calling MyRunnable2 from main....9 

Child Class        - line 1 

Child Class        - line 2 

End of Child loop        - line 3 

Calling MyRunnable2 from MyThread    - line 4 

MyRunnable2 Class....Main....9     - line 5 

MyRunnable2 Class....From MyThread run....5 

CODE: -

public class ThreadPriority 
{ 

    public static void main(String[] args) 
    { 
     MyThread t = new MyThread(); 
     System.out.println(Thread.currentThread().getPriority()); 
     System.out.println(t.getPriority()); 
     t.setName("From MyThread"); 

     Thread.currentThread().setPriority(9); 

     System.out.println("Main Thread Priority :" + Thread.currentThread().getPriority()); 
     System.out.println(t.getPriority()); 



     MyRunnable2 r4 = new MyRunnable2(); 
     Thread t4 = new Thread(r4,"Main"); 
     System.out.println("Calling MyRunnable2 from main"+"...."+t4.getPriority()); 

     t.start(); 
     t4.start(); 
    } 

} 


class MyRunnable2 implements Runnable 
{ 
    public void run() 
    { 
     System.out.println("MyRunnable2 Class"+"...."+Thread.currentThread().getName()+"...."+Thread.currentThread().getPriority()); 

    } 
} 
class MyThread extends Thread 
{ 
    public void run() 
    { 
     for (int i=0;i<2;i++) 
      System.out.println("Child Class"); 

     System.out.println("End of Child loop"); 

     MyRunnable2 r2 = new MyRunnable2(); 
     Thread t2 = new Thread(r2,"From MyThread run"); 
     System.out.println("Calling MyRunnable2 from MyThread"); 
     t2.start(); 

    } 
+0

優先度はJavaスレッドのためのちょっと壊れた概念なので、これらの数字は、オペレーティングシステムの推奨事項です。実際には実装/ OSによって異なります。 – GhostCat

+0

こんにちは@GhostCatそれは私の理解が正しいことを意味し、上記の動作は異常ですか? –

+1

いいえ、スレッドの優先順位を使用して実行順序を決定しないでください。あなたのコードが正しく動作するための要件としてスレッドの優先度に依存する場合、おそらく破損しているでしょう。あなたが重要であれば、同期や 'java.util.concurrent'を使うべきです。 – xTrollxDudex

答えて

0

T4の優先度が高く、そのT4は最初に終了しますという意味ではありません、さらに JVMがスレッドとすべてのためにOSを頼みます優先度はOSの深い層に設定され、 あなたはちょうど推薦を設定されています、それは多くのものに依存します!

0

整数が大きいほど優先度が高くなります。 任意の時点で、複数のスレッドが実行可能な状態になると、ランタイムシステムは、実行のために最も高い優先度を持つ実行可能スレッドを選択します。 何らかの理由で、そのスレッドが停止しているか、利回りに達していないか、または実行不能になった場合にのみ、優先度の低いスレッドが実行を開始します。

同じ優先度の2つのスレッドがCPUを待機している場合、スケジューラはそのうちの1つをラウンドロビン方式で実行するように選択します。

ルール:常に、最も優先度の高いスレッドが実行されています。しかし、これは保証されていません。スレッドスケジューラは、より低い優先度のスレッドを実行して飢餓を回避することを選択することができる。このため、優先度は、効率化の目的でスケジューリングポリシーに影響を与えるためにのみ使用してください。アルゴリズムの正確さのためにスレッドの優先順位に頼らないでください。

上記の情報がクエリを明確にすることを願っています。