マイコード出力は以下の通りである: -の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();
}
優先度はJavaスレッドのためのちょっと壊れた概念なので、これらの数字は、オペレーティングシステムの推奨事項です。実際には実装/ OSによって異なります。 – GhostCat
こんにちは@GhostCatそれは私の理解が正しいことを意味し、上記の動作は異常ですか? –
いいえ、スレッドの優先順位を使用して実行順序を決定しないでください。あなたのコードが正しく動作するための要件としてスレッドの優先度に依存する場合、おそらく破損しているでしょう。あなたが重要であれば、同期や 'java.util.concurrent'を使うべきです。 – xTrollxDudex