【マルチスレッド】マルチスレッドの再開方法

前回はフラグを用いてマルチスレッドを終了する方法を紹介した。
今回は、一度終了したスレッドを再開させる方法について説明する。

フラグを用いてrunメソッドのループを終了するには、以下の様なソースにすると紹介した。

class multiThread extends Thread{
	private boolean threadFlag = true;
	
	public void run(){
		while(threadFlag){
		//ここにマルチスレッドで実行したい処理を書く
		}
	}
	
    //スレッド終了時に呼び出し
	public void stopThread(){
		threadFlag = false;
	}
}

このソースのままで
start()でrunメソッドを実行→stopThreadで中断→再度start()でrunメソッドを実行
とすると、at java.lang.Thread.start(Unknown Source)とエラーがでてしまう。
どうやらrunメソッドを一度終了すると、スレッドの実体がなくなってしまうらしい。

そこで、以下のようにstartメソッドの中でオブジェクト作成を行うことによって、この問題は解決できる。

class multiThread extends Thread{
	private boolean threadFlag = true;
	
    //スレッド開始時に実体を作成
	public void start(){
		threadFlag = true;
		new Thread(this).start();
	}

	public void run(){
		while(threadFlag){
		//ここにマルチスレッドで実行したい処理を書く
		}
	}
	
    //スレッド終了時に呼び出し
	public void stopThread(){
		threadFlag = false;
	}
}

【マルチスレッド】マルチスレッドの終了方法

複数の処理を同時に実行できるマルチスレッド。
今回はマルチスレッドで一度走らせた処理を終了する方法について記述する。

マルチスレッドを利用する時は、下記のようにThreadクラスを継承したクラスの中に、runメソッドを記述する。

class multiThread extends Thread{
	public void run(){
		//ここにマルチスレッドで実行したい処理を書く
	}
}

このrunメソッドを実行することにより、マルチスレッドでプログラムが実行される。

その実行しているプログラムを停止するために、あらかじめThreadクラスの中にstopメソッドが用意されているが、このstopメソッドは利用が推奨されていない。
どうもプログラムを強制的に終了するため、捜査中のデータに不整合が生じる恐れがあるそうだ。

そこで以下のように、runメソッドの中でwhileループを走らせ、stopメソッドでそのwhileループの引数を変更させるのが一般的である。

class multiThread extends Thread{
	private boolean threadFlag = true;
	
	public void run(){
		while(threadFlag){
		//ここにマルチスレッドで実行したい処理を書く
		}
	}
	
	public void stopThread(){
		threadFlag = false;
	}
}