スレッド化を始めたばかりです。100 個のスレッドをセットアップして開始し、5 秒間待ってから中断するメイン クラスを作成しました (少なくとも、それが実行されたと思います)。
public static void main(String[] args) {
List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < 100; i++) {
Thread t = new Thread(new Walker());
threads.add(t);
}
System.out.println("Starting threads...");
for (Thread thread : threads) {
thread.start();
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// don't do anything
}
System.out.println("Time's up - Terminating threads...");
for (Thread t : threads) {
t.interrupt();
System.out.print(".");
}
for (Thread t : threads) {
try {
t.join(10);
} catch (InterruptedException e) {
// don't do anything
}
}
System.out.println("");
System.out.println("All done.");
}
スレッドは次のように見えました。
public class Walker implements Runnable {
public void run() {
for (int i = 0;; i++) {
//do some complicated stuff that takes some time
System.out.println(Thread.currentThread().getName() + ":" + i);
if (Thread.interrupted()) {
break;
}
}
}
}
さて、私が得た出力は、メインスレッドがスレッドに割り込み始めたということでしたが、一部のサブスレッドは終了する前に数回実行し続けました (つまり、ループの繰り返し)。
スレッドを開始しています...
スレッド-1:0
スレッド-2:0
スレッド-1:1
スレッド-3:0
[...]
時間切れ - スレッドを終了しています...
......スレッド-1:60
スレッド-1:61
...スレッド-1:62
スレッド-2:55
..すべて完了。
[スレッドからの出力がここでも続くことがある - join() の後]
当時、私は単一のスレッドに数回実行するのに十分なプロセッサ時間を割り当てることができることを完全には理解していませんでした。
しかし、メインスレッドがスレッドを終了する (つまり、中断する) 機会が得られる前に、スレッドがある程度の (長い) 時間実行されてもまったく問題ないことがわかりましたが、まだ疑問に思っています:すべてを中断する簡単な方法はありますか?メインスレッドから子スレッドをタイムリーに実行しますか? (スレッドのコンストラクターを介して「存続時間」を設定し、それを Walker クラス内でテストすることは、私が望むものではありません。)
また、すべてのスレッドが join() された後、最後の print ステートメントを実行して、個々のスレッドからの出力を確認することは可能ですか? (たぶん、別の場所で不具合が発生している可能性があります。実際のコードはもう少し複雑です...)