重複の可能性:
Java でスレッドを開始/停止/再起動する方法は?
1. 実行中のスレッドで start() を呼び出すと、エラーになります。 2. 停止しているスレッドで start() を呼び出しても、何も起こりません。
同じオブジェクトでの再起動をサポートしない理由は何ですか?
重複の可能性:
Java でスレッドを開始/停止/再起動する方法は?
1. 実行中のスレッドで start() を呼び出すと、エラーになります。 2. 停止しているスレッドで start() を呼び出しても、何も起こりません。
同じオブジェクトでの再起動をサポートしない理由は何ですか?
OSレベルのスレッドは通常、このように動作するため、設計者はそうしたと思います。作成され、実行される可能性があり、その後破棄され、オペレーティングシステムがクリーンアップを実行します。したがって、おそらく Java 設計者は、Java のスレッドの概念を、ほとんどのオペレーティング システムのスレッドの概念に近づけたいと考えていました。メソッドstart()
とメソッドstop()
は、スレッドを一時停止するためのものではなく (そのための同期があります)、スレッドを実行させてオブジェクトを破棄することのみを目的としています。たぶん、名前は少し混乱しています。stop()
は推奨されておらず、使用すべきではないことにstop()
注意してくださいstart()
。
Thread.run() メソッドの背後にあるアイデアのため。アイデアは、すべてのスレッドにライフサイクルがあり、有効期限が切れる (run() メソッド ブロックを終了する) 場合、スレッドは停止するというものです。時間のパーティションでスレッドを停止してから再度実行する場合、一般的な方法は Runnable インターフェイスを実装する (または Thread クラスを拡張する) ことであり、内部にブール値のフラグを取得します。簡単なコードは次のとおりです。
public class MyThread implements Runnable {
private Thread t;
private boolean isRestarted;
private boolean isInterrupted;
public MyThread() {
t = new Thread(this);
isInterrupted = false;
isRestarted = false;
t.start();
}
public void run() {
//Do somework
while(true) {
if(isInterrupted) break;
if(isRestarted) run();
}
}
public void restart() { isRestarted = true; }
public void interupt() { isInterrupted = true; }
}
スレッドが中断されない場合、スレッドは再開されるのを待ちます。中断すると、再起動できなくなります。