2017-11-11 4 views
2

Javaのスレッドが割り込み方法で割り込みを受ける前に、準備状態にする必要がありますか? 私はこれを以下の上記のコードを入力して確認しようとしました。コードに応じてスレッドは中断される前にRUNNABLE状態にする必要がありますか?

class MyThread extends Thread 
{ 
    public void run() { 
     try 
     { 
      for(int i =0;i<10;i++) { 
       System.out.println("I am lazy thread"); 
       Thread.sleep(2000); 
      } 
     } 
     catch(InterruptedException e) { 
      System.out.println("I got interrupted"); 
     } 
    } 
} 

public class SleepAndInterruptDemonstrationByDurga { 
    public static void main(String[] args) { 
     MyThread t= new MyThread(); 
     t.start(); 
     t.interrupt(); 
     System.out.println("End of main thread"); 
    } 
} 

も、常にしようとした後、1以下だった私が得たものを出力何回

End of main thread 
I am lazy thread 
I got interrupted 

できないのはなぜ出力が

I am lazy thread 
I got interrupted 
End of main thread 

なること割り込みメソッドがメインスレッドによって最初に呼び出されることがわかります。最終的に私はスレッドが開始される前に割り込み呼び出しが最初に実行されたときに何らかの状況が発生する可能性があることを尋ねたいと思います。ここでは何が起こる

答えて

1

は、あなたが開始するスレッドを実行する準備をする時間が必要なので、「メインスレッドの終わりには、」おそらく、それが保証されていないものの、最初に印刷しようとしている

1)です。

2)割り込みフラグは、新しいスレッドが開始される前に設定されますが、スレッドがスリープするまで、そのフラグの状態を確認するものはありません。フラグだけを設定するスレッドで割り込みを呼び出すと、スレッドはsleepやisInterruptedなどの呼び出しを行わない限り応答するものは何も行いません。だから、 "私は怠惰なスレッド"です "私は中断した"前に表示されます。

割り込みは任意であり、中断されたスレッドの協力が必要です。スレッドが実行されるまで、割り込みフラグの状態を処理することはできません。なぜなら、いくつかのコードはフラグをチェックしてそれに対処する必要があるからです。

+0

に呼ばれたことを示しRUNNABLE状態であります睡眠前の準備状態が呼び出される。割り込み状態に入る前に、スレッドはスリープ状態になっていなければなりません。スレッドが中断されるのを一時的に待つためには、スレッドは最初に準備完了状態になっていなければなりません。ではない? –

+0

@Deep:その良いですか? –

+0

はまた、子スレッドが最初のスレッドは、それが実行されている必要があり、割り込みの状態に基づいて行動するためのコード –

0

スレッド開始前にSystem.out.println("End of main thread");行が実行されている可能性があります。私のコンピュータでは、プログラムはEnd of main threadを最初、二番目または最後に印刷することがあります。

あなたの疑問にお答えしますが、Javaスレッドには「準備完了」または「中断」という状態はありません(documentation参照)。 Thread.interrupt()はスレッドの状態を「終了」に変更するだけです。

も効果はありませ生き必要ではないスレッドを中断:

またhereを参照してください。

+0

あるライブスレッド手段をありがとう実際に実行可能な...右ですか? –

0

メインスレッドが他のスレッドが完了するのを待つ場合は、t.join()を実行する必要があります。

+0

はい...それは...あなたの応答 –

2

が割り込み方法で中断される前に、Javaのスレッドが準備完了状態にある必要がありますか?

interruptメソッドは実際にスレッドを中断しません。呼び出されたスレッドの中断状態を設定するだけです。つまり、interruptメソッドとstartメソッドへの呼び出しを逆にすると、Threadが中断されないことがわかります。

MyThread t = new MyThread(); 
t.interrupt(); 
t.start(); 

これはThreadに影響を与えるためにThread.interrupt方法のために、最低限の要件はstartinterruptメソッドの前にThreadに呼び出されたことになることを確認する必要があります。

には、スレッドの状態がレディ状態と呼ばれていないがあります。あなたが参照していることは、私はあなたの応答に感謝しかし、私が求めていますが、割り込み呼び出しが行われた上糸かどうか、であることが必要であるということであるstartThread

+0

はい...実際に私は実行可能状態を言うためのものに感謝正しいです...ご回答ありがとうございました –

関連する問題