()メソッドをマルチスレッド開始の原則の解釈について

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によって作成されたスレッドの主な方法とシステムスレッドグループ、および開始によって開始されることはありません。

 

 

おすすめ

転載: www.cnblogs.com/zitai/p/11823968.html