私がしなければならないことは、複数のスレッド(例えば、3つのスレッドをサンプルコードにする)を作成し、各スレッドが独自の計算を実行することです。各スレッドがその計算を終了した後、対応するスレッドを停止する必要があります。Javaで複数のスレッドで一度に各スレッドを停止する方法はありますか?
How to stop a thread in Java? Example からコードを取得しました。これは1つのスレッドでうまく機能します。
ただし、このコードを複数のスレッドに変更すると、各スレッドは停止せずに実行され続けます。つまり、スレッドはdoSomeComputation()を終了しますが、スレッドを停止するのではなく、最初から再計算します。
私はグーグルでこのウェブサイトを検索していて、これを(割り込み、Thread.stop()などを使用して)試しました。しかし、私が望む方法を見つけることができませんでした。自分のdoSomeComputation()が各スレッドで実行されるたびに、各スレッドを停止する方法は?
import java.util.concurrent.TimeUnit;
import static java.lang.Thread.currentThread;
public class ThreadStopDemo {
public static void main(String args[]) throws InterruptedException {
ThreadStopDemo tsd = new ThreadStopDemo();
tsd.test2(); // NOT stop
// tsd.test1(); // stop
}
// this works well.
void test1() throws InterruptedException {
Server myServer = new Server();
Thread t1 = new Thread(myServer, "T1");
t1.start();
System.out.println(currentThread().getName() + " is stopping Server thread");
myServer.stopThread();
TimeUnit.MILLISECONDS.sleep(200);
System.out.println(currentThread().getName() + " is finished now");
}
// this doesn't stop and keeps running.
void test2() throws InterruptedException {
Server[] pool = new Server[3];
for(int i = 0; i < pool.length; i++) {
pool[i] = new Server();
pool[i].start();
}
for(int i = 0; i < pool.length; i++) {
System.out.println(currentThread().getName() + " is stopping Server thread");
pool[i].stopThread();
TimeUnit.MILLISECONDS.sleep(200);
System.out.println(currentThread().getName() + " is finished now\n");
}
}
}
class Server extends Thread {
private volatile boolean exit = false;
public void run() {
while (!exit) {
System.out.println(currentThread().getName() + " Server is running.....");
doSomeComputation();
}
System.out.println(currentThread().getName() + " Server is stopped....");
}
public void stopThread() {
exit = true;
}
void doSomeComputation() {
...
}
}
スレッドを停止する通常の方法は、 'Thread.interrupt()'を呼び出し、スレッドの 'Runnable'の' run() 'コードをwhile(!Thread.currentThread()でループさせることです。 isInterrupted()) 'です。 Javaスレッドはうまくやってみると、スレッドが中断することを要求します。中断すると、 'Runnable'がうまくいくかどうかを確認することができます。 – billie
まだ実行中の場合は、doSomeComputation()をまだ実行中であることを意味します。 –
'run()'メソッドに 'while(!exit)'ループがあるのはなぜですか? 'run()'メソッドが終了するとスレッドは自動的に終了するので、キャンセルするまで計算を繰り返さないようにするにはwhileループは必要ありません。スレッドを取り消し可能にしたい場合、 'doSomeComputation()'は定期的にキャンセルフラグをチェックして戻ります。 'java.util.concurrent'のクラス、特に有用なフレームワークを提供する' ExecutorService'、 'FutureTask'、' ExecutorCompletionService'を見てください。 –