この記事は、再現される- https://www.cnblogs.com/marsitman/p/11228684.html
新しい、準備、実行されている、ブロック、破壊:スレッドのライフサイクルには、5つのステージで構成されています。
-
新:スレッドのうち新しい、新しいメソッドを単に使用されています。
-
レディ:そのstart()メソッドは、スレッドの後に呼び出され、スレッドがCPUリソースの割り当て段階を待っているこの時、開始CPUリソースを、つかむために最初に。
-
実行:準備スレッドが予定されているとCPUリソースへのアクセスは、それが運転に入った場合は、実行方法は、操作とスレッドの関数を定義しています。
-
ブロックされた:それは、スレッドは、このような睡眠()、待って()スレッドの後のように、ブロッキング状態に何らかの理由で状態を実行する可能性があり、走行状態は、ブロックされた状態にあり、この時間は、他のメカニズムの必要性がブロックされた状態になりますスレッドは、そのような通知またはのnotifyAll()メソッドを呼び出すように、ウェイク。再開されたスレッドの実行方法は、彼らが再び操作にCPUリソースの割り当てを待って、すぐに実行されません。
-
破壊:スレッドまたはスレッドが正常に終了に先駆け必須終了または異常な鉛の終了している場合、スレッドは、リソースの解放を破壊されます。
次のように完全なライフサイクルは次のとおりです。
新しいステータス
私たちは、以下のコードを見てみましょう。
1
|
Thread t1 =
new
Thread();
|
オペレーティングシステムレベルで、本当のスレッドが作成されていない間、ちょうど、このプログラミング言語Javaレベルで作成されるように、ここで作成しました。我々はstart()メソッドを呼び出した場合のみ、スレッドが実行可能状態に出て作成されます。我々はstart()メソッドを呼び出した場合のみ、スレッドが出て作成されます。
レディ
JVMプロセスが新しいスレッドを作成することになり、このスレッドは、すぐにCPUを実行するようにスケジュールされることはありません、実行中状態に入り、中間状態があるだろう、実行可能状態であるstart()メソッドを呼び出した後、あなたは、CPUとして理解されるのを待つことができますスケジュールのステータス
1
|
t1.start()
|
次のように図で表されます:
次いで、スレッドは、実行可能状態遷移がどの状態を発生する可能性がありますか?
Runnable状态的线程无法直接进入Blocked状态和Terminated状态的。只有处在Running状态的线程,换句话说,只有获得CPU调度执行权的线程才有资格进入Blocked状态和Terminated状态,Runnable状态的线程要么能被转换成Running状态,要么被意外终止。
运行状态
当CPU调度发生,并从任务队列中选中了某个Runnable线程时,该线程会进入Running执行状态,并且开始调用run()方法中逻辑代码。
那么处于Running状态的线程能发生哪些状态转变?
-
被转换成Terminated状态,比如调用 stop() 方法;
-
被转换成Blocked状态,比如调用了sleep, wait 方法被加入 waitSet 中;
-
被转换成Blocked状态,如进行 IO 阻塞操作,如查询数据库进入阻塞状态;
-
被转换成Blocked状态,比如获取某个锁的释放,而被加入该锁的阻塞队列中;
-
该线程的时间片用完,CPU 再次调度,进入Runnable状态;
-
线程主动调用 yield 方法,让出 CPU 资源,进入Runnable状态
阻塞状态
Blocked状态的线程能够发生哪些状态改变?
-
被转换成Terminated状态,比如调用 stop() 方法,或者是 JVM 意外 Crash;
-
被转换成Runnable状态,阻塞时间结束,比如读取到了数据库的数据后;
-
完成了指定时间的休眠,进入到Runnable状态;
-
正在wait中的线程,被其他线程调用notify/notifyAll方法唤醒,进入到Runnable状态;
-
线程获取到了想要的锁资源,进入Runnable状态;
-
线程在阻塞状态下被打断,如其他线程调用了interrupt方法,进入到Runnable状态;
终止状态
一旦线程进入了Terminated状态,就意味着这个线程生命的终结,哪些情况下,线程会进入到Terminated状态呢?
-
线程正常运行结束,生命周期结束;
-
线程运行过程中出现意外错误;
-
JVM 异常结束,所有的线程生命周期均被结束。