並行プログラミングの研究ノート(第三に、安全にスレッドを終了する方法)

内容:

  • セット終了識別子
  • ()メソッドを中断
  • 概要

セット終了識別子:

1つの パブリック クラス FlagThreadは延びスレッド{
 2      / ** 
3       *退出标识
 4       * / 
5      公共 揮発性 ブール出口= 6  
7      @Override
 8      公共 ボイドラン(){
 9          ながら(!出口){
 10          }
 11          のSystem.out.println( "ThreadFlag线程退出" )。
12      }
 13  
14      公共 静的 ボイドメイン(文字列[]引数)スロー{例外
 15          FlagThread threadFlag = 新しい新しいFlagThread();
 16          threadFlag.start();
 17          // メインスレッド(3秒)
18は、          SLEEP(3000 );
 19          // TODOスレッドは、スレッド終了
20は          threadFlag.exit = trueに21であり、         // メインCPUスレッドを使用する権利放棄する
 22          //をthreadFlag実行が終了するまでthreadFlagスレッドが継続することにする
23          threadFlag.joinを();
 24          のSystem.out.println( "スレッドが終了!" );
 25      }
 26 }

5行目の出口プロパティによってスレッドが撤退すべきかどうかを示す。しかし、ブロックされたスレッドが、それは動作しません識別した場合、このメソッドは、欠点があります。

()メソッドを中断:

1つの パブリック クラス InterruptThreadは延びスレッド{
 2      / ** 
3       *退出标识
 4       * / 
5      揮発性 ブール出口= 6  
7      @Override
 8      公共 ボイドラン(){
 9          ながら(!出口){
 10              のSystem.out.println(のgetName()+ "実行されています" )。
11              試み{
 12                  にThread.currentThread()(ジョイン)。
13              } キャッチ(InterruptedExceptionあるE){
 14                  のSystem.out.println( "ウィークブロックからアップ..." );
 15                  // コード状態ハンドリング共有変数例外を修正する
16                  =終了をtrueに;
 17              }
 18である         }
 。19          のSystem.out。 println(のgetName()+ "ISを出..." );
 20である     }
 21は、 
22である     パブリック 静的 ボイドメイン(文字列[]引数)スローInterruptedExceptionある{
 23は          InterruptThread InterruptThread = 新しい新しいInterruptThreadを();
 24         System.out.println( "スレッドを開始..." );
 25          interruptThread.start();
 26はある          のThread.sleep(3000 );
 27          のSystem.out.println( "割り込みスレッド...:" + interruptThread.getName( ));
 28          // trueに終了するように設定識別子
29          = interruptThread.exit trueに30          interruptThread.interrupt();
 31である         // メインスレッドは、スレッド割り込みがinterruptThread観察するために3秒を眠る
32          のThread.sleep(3000 );
 33である          システム.out.println( "ファイル・アプリケーションを停止..." );
 34である     }
 35 }

ライン30ノート場合、メインスレッドが終了した後、次いで、サブスレッドCPU InterruptThreadを使用する権利を引き継ぐためにライン12を実行し、その後、子スレッドがブロックされる。図29は、無駄な行の同定につながりました。

その中の場合は、唯一のスレッド(コードの30行)を破るためのイニシアチブを取る必要があります。

 

 

 

 

 

 

 

 

 

 

パブリッククラス InterruptThreadが拡張スレッド{ 
/ **
*退出标识
* /
揮発性ブール終了 = 偽;
@Override ます。public void 実行(){ (!エグジット){ システム。アウト .println(のgetName()+ "実行されています"; 試す { スレッドを。currentThread().join() } キャッチ(InterruptedExceptionある電子){ システム。アウト .println(「ブロックから週まで...」







;
//コードの状態の取り扱い共有変数例外変更
終了]を = ; trueにする
}
}
システム。OUT .println(のgetName()+ "ISを出..." ;
}

公共の静的な無効メイン(文字列[] args)をスローします {InterruptedExceptionある
InterruptThread InterruptThread = 新新 InterruptThread();
。システムOUT .println("スタートスレッド..." ;
interruptThread.start();
。スレッドSLEEP3000;
。システムOUT .println("割り込みスレッドは...:" + interruptThread.getName());
//セット識別子がtrueに終了し
InterruptThread。終了]を = trueに、
interruptThread.interruptを();
スレッドInterruptThreadの停止を観察するために//スリープメインスレッド3秒に
スレッドを。SLEEP3000;
。システムは、OUT .println("ファイルのアプリケーションを停止..." ;
}
}

おすすめ

転載: www.cnblogs.com/bzfsdr/p/11565280.html