私はJavaで未来とマルチスレッドを初めて使用しています。複雑であることが判明した単純な問題があります。無限に開いている多数のスレッド (すべてに開いているセッションがあります) があります。1 つのスレッドがカスタム例外 (セッションでのタイムアウト例外) をスローするたびに、すべてのスレッドを中断し、すべてのセッションを適切に閉じる必要があります。私がしていることは、スレッドから返された将来のオブジェクトを (ArrayList に) 格納し、それをループ処理して、1 つのスレッドが例外をスローしたときにすべてに対して future.cancel を発行することです。
private static void futureCancel()
{
for(int i=0;i<numberStreams;i++)
{
Future<String> future=futureList.get(i);
try{
future.cancel(true);
future.get();
}
catch(InterruptedException e)
{
System.out.println("In interrupted block!");
} catch (ExecutionException e) {
e.printStackTrace();
}
}
return;
}
ここでの問題は、いくつかの要件の問題と、セッションの反対側での動作方法が原因で、スレッド コードに InterruptedException を追加できないことです。callable から InterruptedException をスローすると、上記で指定した catch ブロックに到達しません。スレッドにスリープを追加して (テストには問題ありません)、InterruptedException を処理すると、future.cancel が発行されるとすぐにそのブロックに入ります。私は何を間違っていますか?