for ループ内のどこかでキャッチしている場合はInterruptedException
、それらの try/catch ブロックをすべて削除し、代わりに for ループ全体を囲む単一の try/catch を作成します。これにより、スレッドを中断したときに for ループ全体を停止できます。
同様に、 catch の場合はIOException
、catch InterruptedIOException
and ClosedByInterruptException
first. これらの catch ブロックを for ループの外に移動します。IOException
(外部レベルでキャッチするものが何もないため、内部でキャッチしている場合、コンパイラはそれを許可しません。)
ブロッキング呼び出しが throwingInterruptedException
でない場合は、次のように、それぞれの後にチェックを追加する必要があります。
if (Thread.interrupted()) {
break;
}
多くのレベルのループがある場合は、ラベルを追加して、最初の「命令」ループから直接終了できるようにすることをお勧めします。多くのフラグ変数を追加する必要はありません。
instructions:
for ( ... ) {
for ( ... ) {
doLongOperation();
if (Thread.interrupted()) {
break instructions;
}
}
}
いずれにせよ、割り込みが処理されると、バックグラウンド スレッドが最初の for ループに割り込むことができます。
final Thread instructionsThread = Thread.currentThread();
Runnable interruptor = new Runnable() {
public void run() {
instructionsThread.interrupt();
}
};
ScheduledExecutorService executor =
Executors.newSingleThreadScheduledExecutor();
executor.schedule(interruptor, 5, TimeUnit.MINUTES);
// instructions
try {
for ( ... ) {
}
} catch (InterruptedException |
InterruptedIOException |
ClosedByInterruptException e) {
logger.log(Level.FINE, "First loop timed out.", e);
} finally {
executor.shutdown();
}
// instructions2