Java マルチスレッド プログラミングでは、java.lang.Thread 型には一連のメソッド start()、stop()、stop(Throwable)、suspend()、destroy()、resume() が含まれます。これらのメソッドを通じて、スレッド上で便利な操作を実行できますが、これらのメソッドのうち、start() メソッドのみが保持されます。
これらのメソッドを廃止する理由は、Sun の記事「Why are Thread.stop、Thread.suspend、Thread.resume Deprecated?」で詳しく説明されています。
本当にスレッドを終了する必要がある場合は、次の方法を使用できます。
1. スレッドの run() メソッドの実行が終了し、スレッドが自然に終了します。 (この方法が一番良いです)
2. while(flag){} などのフラグ ビットをポーリングおよび共有してスレッドを終了します。フラグの初期値は true に設定され、終了する必要がある場合は、フラグの値を false に設定します。 (このメソッドもあまり良くありません。while(flag){} メソッドがブロックされると、フラグが無効になってしまうからです)
プライベート揮発性ブール値 stop = false;
public void terminate() {
停止 = true;
}
public void run() {
while(停止) {
// ... いくつかのステートメント
}
}
}
sleep() や wait() の実行によりスレッドが Not Runnable 状態になった場合、wait() の場合はフラグビットを使用すると動作しません。
public Final void wait(長いタイムアウト)
throws InterruptedException このメソッドにより、現在のスレッド (T とします) がそれ自体をオブジェクトの待機セットに配置し、このオブジェクトに対するすべての同期要件が放棄されます。つまり、現在のスレッドは待機状態になります。
wait() の標準的な使用法
同期化(obj){
while(<条件が満たされていない>){
obj.wait();
}
条件を満たす加工工程
}
それを停止したい場合は、3 番目のものを使用できます。
3.interrupt() を使用すると、プログラムは InterruptedException 例外をスローし、実行スレッドが run() メソッドを終了します。
例えば:
パブリック クラス SomeThread {
public static void main(String[] args)
{
スレッド thread=new Thread(new Runnable(){
public void run() {
while (!Thread.interrupted()) {
// 処理対象のワークを処理します
試す {
System.out.println("寝る");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("中断されました!");
}
});
thread.start();
thread.interrupt();
}
}
寝る
中断されました!