我是 Java 中的未来和多线程的新手。我有一个简单的问题,结果却很复杂,我有许多线程(它们都有打开的会话),它们是无限打开的。每当一个线程抛出自定义异常(会话超时异常)时,我必须中断所有线程并优雅地关闭所有会话。我所做的是存储线程返回的未来对象(在 ArrayList 中)并循环遍历它,并在一个线程引发异常时为所有对象发出 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。如果我从我的可调用对象中抛出一个 InterruptedException,它不会到达上面指定的 catch 块。如果我在我的线程中添加睡眠(可以进行测试)并处理 InterruptedException,它会在 future.cancel 发出后立即进入该块。我究竟做错了什么?