2016-10-26 2 views
-1

以下に示すコードスニペットは、2つの異なる実行時に異なる出力を示します。最初の場合は「出力1」を、2番目の場合は「出力2」を与えます。スレッドスケジューラがスレッドを選択してからrun()メソッドを完了しないと、m2スレッドをどのように起動できるのか分かりません。誰も私にここに正確に何が起こっているか説明することはできますか?なぜ、「出力1」と「出力2」を別の時間に取得するのですか?私は "出力1"は正しい出力だと思います。スレッドスケジューラがスレッドを選択する

class TestMultiPriority1 extends Thread 
{ 
public void run() 
{ 
    System.out.println("running thread name is:"+Thread.currentThread().getName()); 
    System.out.println("running thread priority is:"+Thread.currentThread().getPriority()); 
} 
public static void main(String args[]) 
{ 
    TestMultiPriority1 m1=new TestMultiPriority1(); 
    TestMultiPriority1 m2=new TestMultiPriority1(); 
    m1.setPriority(Thread.MIN_PRIORITY); 
    m2.setPriority(Thread.MAX_PRIORITY); 
    m1.start(); 
    m2.start(); 
    } 
}  

出力1:

running thread name is:Thread-0 
running thread priority is:1 
running thread name is:Thread-1 
running thread priority is:10 

出力2:

running thread name is:Thread-0 
running thread name is:Thread-1 
running thread priority is:1 
running thread priority is:10 
+0

正しいことは、正しいものを定義するのが開発者としての仕事だということです。私たちは、何かが正しいことを「考える」ことはしません。事前に正しいことが分かっており、プログラムがそのように動作することを確認します。このような制約を[同期、ロックまたはその他のメカニズム](https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html)で定義する必要があるマルチスレッドの場合、これは特に重要です。これらの制約なしで並列に2つのスレッドを開始するだけの場合は、相対的なタイミングについて何も仮定することはできません。優先順位を設定してもそれは変わりません。 – biziclop

答えて

1
私は理解していない

そのスレッドスケジューラは、(それが実行されます完了せず、その後のM1スレッドを選ぶ場合)メソッドを使用してm2スレッドを開始する方法

これはありません。 m1スレッドを作成した元のスレッド(まだ実行されている可能性があります)は、m2スレッドを作成します。両方のスレッドが作成されると、マシンに十分なコアがある場合に両方のスレッドを実行できます。そうでない場合でも、スケジューラはいつでもスレッドを切り替えることができます。

いずれの出力も正しくありません。それらは、スケジューラのさまざまな決定に起因します。

関連する問題