2017-06-28 17 views
0

子スレッドを中断するプログラムを作成しようとしています。"main method" printlnが最初に印刷されている理由

なぜSystem.out.println("main method")が最初に印刷されてからt.run()が実行されるのですか?

import java.util.*; 
import java.lang.*; 
import java.io.*; 


class TryCatchReturn extends Thread 
{ 

    public void run() 
    { 
    for(int i=0;i<5;i++) 
    { 
     try 
     { 
      System.out.println("i will get interrupted"); 
     } 
     catch (Exception e) 
     { 
      System.out.println("catch interruputed"); 
     } 
    } 
    } 

} 



class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
    TryCatchReturn t=new TryCatchReturn(); 
    t.start(); 
    t.interrupt(); 
    System.out.println("main method"); 
    } 
} 
+3

'start'を呼び出すと2つの並行スレッドが共存するため、メインと新しいスレッドを実行する*古いプレーン*があります。メインスレッドが最初に実行しているようです。 –

+2

正しい答えはおそらく「だから」です。注文スレッドが実行されるという保証はありません。 't.interrupt()'の後に 'Thread.sleep(1)'を追加すると、間にシステムコールがあるため実行順序を逆転させるでしょう。 – dhke

+0

これは割り込みのみですか?なぜなら、スレッドのjoin()メソッドを使用して同じコードを書き込むと、最初の子メソッドが実行されてからメインスレッド – Swati

答えて

0

スレッドが睡眠または待ち状態にない場合、 割り込み()メソッドを呼び出すと、通常の動作を実行し、 スレッドを中断することはありませんがtrueに割り込みフラグを設定します。

Yunesが述べたように、メインスレッドと新しいスレッドは共存して共存します。

thisもご覧ください。

0

スレッドを開始しました。メインメソッドの次のコード行は、スレッドが完了するのを待つことはありません。

+0

@ codespawner.meansは最初にメインスレッドが実行され、次に子スレッド – Swati

+0

は非同期実行です。別のスレッドを起動すると、非同期で実行されます。 – codespawner

0

コメントで説明したように、とtの両方が、start()メソッドを呼び出したときに並行して実行されるため、スレッドのシーケンスが実行される保証はありません。 run()メソッドは、同じスレッド上で実行されるので、最後に "main method"を出力します。あなたのプログラムを実行して、私はデバッグ時に以下の出力を得ました。

Threads output

私はあまりにも順序が非決定的で伝える最初のインスタンスで、あなたの出力(デバッグなし)、...このことができます:)

希望を持って!

+0

は、基礎となるプラットフォームOSに依存しますか? – Swati

+0

いいえ、OSに依存しません。最初に何が印刷されているかを確認するには、ログにタイマーを追加して、現在のタイムスタンプをマイクロ秒精度で印刷してチェックします。 – harshavmb

0

マルチスレッドへようこそ。

  1. はまず、1つのスレッド(mainメソッドが実行されているもの)を持っている:

    はここで何が起こっているかです。

  2. メインメソッドの2番目のスレッドを作成します。
    -maメインスレッドは実行を継続し、割り込みメソッドを呼び出します。
    -mbメインスレッドは実行を継続し、System.out.printlnメソッドを呼び出します。
    -2a新しいスレッドが実行を開始し、System.out.printlnメソッドを呼び出します。
    -2bi新しいスレッドが中断され、System.out.printlnメソッドが呼び出されます。
    -2bii新しいスレッドは実行を継続し、forループを終了します。

のみ保証実行順序は、以下である:

ステップ1は、第1起こります。
ステップ2が2番目に発生します。始まる
すべてのステップ「 - 」
ステップ-2Aは-2biと-2bii

工程の前に起こるステップ場合は、予測できない-ma工程の後に起こる-mbステップ2.
工程の後に起こります-2biまたはステップ-2biiが起こる。 これはスレッドの実行順序に依存します。あなたは2つのスレッドが作成されるプログラムを実行すると、あなたが-2biステップ、その後、5から5000000へのあなたのループを変更する場合は

ははるかに起こる可能性が高いステップ-2bii

0

よりも、人はどこのメインスレッドですメインメソッドは実行され、もう1つはTryCatchReturn型の 't'スレッドです。

main()メソッド内でstart()メソッドを呼び出すと、mainThreadとtスレッドの両方が開始され、それぞれのペースで終了します。 mainThreadが最初に終了し、スレッドが実行を終了することがあります。

最初にスレッドを終了させたい場合は、メインスレッドにスレッドの実行を待たせるように指示する必要があります。これは、join()メソッドを使用して行われます。

sleep()メソッドを呼び出すことで、メインスレッドの実行をしばらく保持することもできます。