別のスレッドから無限ループを実行しているスレッドに到達し、そのスレッドで割り込みを呼び出すことができます。ただし、何をしているのかを十分に確認する必要があります。また、中断されたスレッドが中断されたときに正しく動作することを期待してください。
ここでは、識別を容易にするために、問題のあるループを使用してスレッドに名前を付けました。次のソリューションは競合状態に対して脆弱であることに注意してください。
Thread loop = new Thread() {
public void run() {
Thread.currentThread().setName("loop");
while(true) {
System.out.print(".");
}
}
}.start();
次に、他のクラスで:
ThreadGroup group = Thread.currentThread().getThreadGroup();
Thread[] threads = new Thread[group.activeCount()];
group.enumerate(threads);
for(Thread t : threads) {
if(t.getName().equals("loop")) {
/* Thread.stop() is a horrible thing to use.
Use Thread.interrupt() instead if you have
any control over the running thread */
t.stop();
}
}
私の例では、2つのスレッドが同じThreadGroupにあると想定していることに注意してください。これが当てはまるという保証はないので、より多くのグループをトラバースする必要があるかもしれません。
これをある程度制御できる場合、ここでの適切なパターンは、while(!isInterrupted())
代わりにループ宣言に含まれ、のt.interrupt()
代わりに使用することですt.stop()
。
これを投稿した後でも、あなたへの私の唯一のアドバイスは、これをしないことです。あなたはそれをすることができます、しかしあなたは本当にすべきではありません。