1、なぜ、スレッドの実行を開始しない()メソッドが、スタートの使用()メソッド
run()メソッドは、クラスの普通の方法で、通常のメソッド呼び出しなどのrunメソッドを呼び出します
スタートは()スレッドが一連の作業で作成し、その後、独自のコンテンツ内のタスクの実行を呼び出します。
認証コード:
/ **
* @Data 2019年11月8日 - 10:29午後
*説明:実行()とstart()
* /
パブリッククラスStartAndRunMethod {
公共の静的な無効メイン(文字列[]引数){
実行可能な実行可能に=新しい実行可能(){
@オーバーライド
ます。public void 実行(){ System.out.println(にThread.currentThread()のgetName()。)。 } }。 runnable.run();
新しいスレッド(実行可能).start(); } }
結果:
メイン
スレッド0
2、スタート()コード説明
- 新しいスレッドのスレッド状態検査を開始します
-
公共 同期 のボイド開始(){ / ** *このメソッドは、mainメソッドのスレッドまたは「システム」のために呼び出されていません VMによって設定/作成*グループスレッド。追加された新機能 *将来的には、この方法にもVMに追加する必要があります。 * * Aがゼロの状態値に相当する状態に「NEW」。 * / もし(threadStatus = 0! ) スロー 新しい(ないIllegalThreadStateExceptionを)。
threadStatus出所について:
-
/ * *ツールのJavaスレッドの状態は、デフォルトでは「まだ始まっていない」スレッドを示し、 * / プライベート 揮発 int型 threadStatus。
私たちは、threadStatusスレッドの状態が記録されたコードで見ることができ、スレッド初期のデフォルトは0です。
- スレッドグループに参加
-
/ * このスレッドが開始されようとしていることをグループに通知 *これは、スレッドのグループのリストに追加することができるように、 *グループの未開始のカウントがデクリメントすることができます。* / group.add(この);
- コールSTART0()
-
ブール開始= 偽; してみてください{ START0(); 開始 = 真; } 最後に{ しようと{ 場合(が!開始){ group.threadStartFailed(この); } } キャッチ(Throwableを無視){ / * 何もしません。START0はその後のThrowableを投げた場合 それは、コールスタックに渡されます* / } } }
START0()メソッドは、C ++で記述された方法を使用するコードではGDKのコードなので、ここではそこに調査しません。
図3に示すように、start()メソッドは、複数回使用することができません。
単にソースコード解析によって、我々は、スレッドが作成されたときにstartメソッドの始まりは、スレッドの状態を確認することを知っている以上、この状態は、それが初期化状態とは異なりスローされます
ないIllegalThreadStateException例外。
テストコード:
/ ** * @Data 2019年11月8日 - 23:57 *説明:スタート回以上使用することはできません * / パブリック クラスCantStartTwice { 公共 静的 ボイドメイン(文字列[]引数){ スレッドスレッド = 新しいスレッド(); thread.start(); thread.start(); } }
4、注意点:
同期の開始方法は、あなたがスレッドの安全性を保証することができ、方法を変更しています。
JVMによって作成されたスレッドの主な方法とシステムスレッドグループ、および開始によって開始されることはありません。