マルチスレッドプログラミング 4章 スレッドの制御
- 4.1. 優先度の設定
- 4.2. スレッドの休止・中断
- 4.3. 推奨されないメソッド
- 4.4. スレッドを停止させるには
4.4. スレッドを停止させるには
stopメソッドは推奨されないメソッドでした。それでは、スレッドを停止させるにはどうすれよいのでしょうか。
スレッドが自分自身を終了させるには、実行中のrunメソッドを終了するようにしておきます。startメソッドによって新しく起動されたスレッドは、runメソッドが終了すると消滅します。
自分以外のスレッドを終了させるには、一般的に次のような方法を用います。
- runメソッドを実装したクラスで、スレッドの実行状態を表現するboolean型変数を宣言する。
- runメソッド内で、繰り返しスレッドの実行状態を確認し、実行状態が「終了」を示す値になっていればrunメソッドが終了されるようにしておく。
- そのスレッド実行状態を変更するためのメソッドを宣言する。
- スレッド実行状態を「実行中」を示す値に設定し、新しいスレッドを起動する。
- 外部から、スレッド実行状態を変更するためのメソッドを呼び出す。
class someThread extends Thread{ private boolean running = true; public void start(){ new Thread(this).start(); } public void run(){ while(running){ ...... //スレッドで実行したい処理 } } public void stopRunning(){ running = false; } }
スレッドの実行状態は、runningというメンバ変数で表現しています。runningの初期値はtrue(実行中を表す)とします。スレッドが起動したあと、runメソッド内のwhileループは、runnningがtrueである限り繰り返し実行されます。
外部からスレッドを停止させるにはstopRunningメソッドを呼び出します。ここでrunningの値がfalseに変更されるので、runメソッド内のwhileループは、次回の条件チェックの際に繰り返し処理を終了します。ループを抜けることによってrunメソッドも終了し、スレッドは消滅します。
(実習課題2)
2章の実習課題2のプログラムに以下の機能を追加しなさい。
- 一定時間内に終了しないソーティングスレッドを強制終了させる機能。
- 処理時間の管理はソーティングスレッド以外で行う事。
- また強制終了までの時間はプログラムの実行時の引数で指定できるようにする事。