2016-01-20 23 views
6

スレッドが実行可能状態と実行状態の間でどのように前後に移動するのかを知りたいと思います。実際に何が起こっているのでしょうか。これはThreadPoolの場合には必要になるでしょうが、完全に理解できません。私はこれを理解する。スレッドは実行状態から実行可能状態にどのように移行しますか?

+1

なぜ知りたいですか?私はこれも知らないが、そのような知識なしで 'ThreadPool'をうまく使っている。 –

+0

スレッドが実行状態にあるということは、実行中のrun()メソッドを意味し、runnableメソッドが実行中のstart()メソッドを実行している場合.... run()からstart()に戻る...私がマルチスレッドの初心者であるときに私が間違っていれば私を修正してください。 –

+0

私はこの質問が好きです。もしそれが欺瞞でないならば、私はそれを開いたままにします。 –

答えて

6

スレッドが実行状態にある場合、その実行run()メソッドとするときにその実行可能な方法でを意味します実行中のstart()メソッド....実行中から実行可能に移動することは、run()からstart()に戻ることを意味します。

ほとんどのオペレーティングシステムの命名法では、「実行中」とはスレッドが実際にはあるCPU上で命令を実行していることを意味し、「実行可能」とは実行するCPUの利用可能性を除いてスレッドが「実行中」を妨げないことを意味します。

Javaプログラムは、これらの2つの状態の違いを認識できません。 Javaが知っているスレッド状態はNEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、およびTERMINATEDです。

t.start()が呼び出される前にスレッドがNEWであり、その後にNEWに戻ることはできません。 WAITINGとTIMED_WAITINGはどちらも、スレッドが他のスレッドでnotify()呼び出しを待っていることを意味します。 BLOCKEDは他のものを待っていることを意味します(たとえば、​​ブロックを入力する)。終了は終了したことを意味します。

0

Yieldは、現在実行中のスレッドに、スレッドプール内の等しい優先度を持つスレッドにチャンスを与えるように指示する静的メソッドです。

Yieldは、現在実行中のスレッドをすぐに実行可能状態にする保証はありません。 yieldメソッドがスレッドをWaitまたはBlocked状態にすることがないという重要な点を忘れないでください。 Running StateからRunnable Stateへのスレッドのみを作成できます。 JavaのSCJP認定にAプログラマーズ・ガイドから

+0

'yield()'はめったに呼び出されませんが、ここで働く主要なメカニズムではありません。コードではないテキストにはコード書式を使用しないでください。 – EJP

+0

@Anand .....説明をくれてありがとうございます。ちょっと疑問が残っています....コードで手動で歩留まりを使用します...そうですか? JVMはこれをどのように処理しますか? –

+0

* "Yieldが現在実行中のスレッドをすぐに実行可能状態にするという保証はありません。" * ...確かに。 Thread.yield()が呼び出されたときにJVMが全く何もしないことは、まったく受け入れられます。 Thread.yield()の正確さのためにThread.yield()の動作に依存するプログラムは、非移植性の高いプログラムであり、最悪の場合深刻な欠陥を持つプログラムです。 – scottb

0

エキス:スレッド:

静的な無効収量() このメソッドは、一時的にその実行を一時停止し、それによって、他のスレッドを実行できるようにするために、現在のスレッドの原因となります。この移行がいつ実行されるかは、JVMによって決定されます。

static void sleep(long millisec)throws InterruptedException 現在のスレッドは、指定された時間スリープしてから再び実行可能になります。

最終無効例外:InterruptedExceptionがスローされます)(参加 最終のボイド(長いミリ秒)スレッドのいずれかが完了したか、それがタイムアウトするまで戻り待機しませんスレッドで呼び出されたこれらの2つの方法のいずれかへの呼び出しInterruptedExceptionある をスロー参加指定された時間後にそれぞれ。

void interrupt() このメソッドは、呼び出されたスレッドを中断します。通知の待機、スリープ、またはブロックされた結合の完了状態では、スレッドはInterruptedExceptionを受け取ります。

以下の例は、スレッド状態間の遷移を示しています。 (1)のスレッドは(2)で少し眠った後、(3)のループで何らかの計算を行い、その後スレッドが終了します。 main()メソッドは(4)のループ内のスレッドを監視し、getState()メソッドによって返されたスレッド状態を出力します。 run()メソッドの実行が開始されるとスレッドはRUNNABLE状態を経て、TIMED_WAITING状態に遷移しスリープ状態になります。起動時には、RUNNABLE状態のループを計算し、run()メソッドが終了するとTERMINATED状態に遷移します。

例:米国

public class ThreadStates { 

    private static Thread t1 = new Thread("T1") { // (1) 
    public void run() { 
     try { 
     sleep(2);         // (2) 
     for(int i = 10000; i > 0; i--);   // (3) 
     } catch (InterruptedException ie){ 
     ie.printStackTrace(); 
     } 
    } 
    }; 

    public static void main(String[] args) { 
    t1.start(); 
    while(true) {         // (4) 
     Thread.State state = t1.getState(); 
     System.out.println(state); 
     if (state == Thread.State.TERMINATED) break; 
    } 
    } 
} 

プログラムから出力可能スレッド:

RUNNABLE 
TIMED_WAITING 
... 
TIMED_WAITING 
RUNNABLE 
... 
RUNNABLE 
TERMINATED 
関連する問題