假设我有如下方法:
public void poll(Callable<Boolean> callable) {
ScheduledExecutorService service = Executors.newSingleThreadedScheduledExecutor();
Future<Boolean> future = service.schedule(callable, 0L, TimeUnit.MILLISECONDS);
try {
while (!future.get()) {
future = service.schedule(callable, 5L, TimeUnit.MINUTES);
}
} catch (ExecutionException e) {
// ...
} catch (InterruptedException e) {
// ...
} finally {
service.shutdown();
}
}
InterruptedException
是如何被抛出(并在poll()
中捕获)的?可调用对象抛出的任何东西(包括InterruptedException
,对吧?)都是ExecutionException
,我们永远不会取消任何期货,并且永远不会调用服务的shutdownNow()
。
题外话:既然如此,是否有可能使这种轮询方法对InterruptedException
之类的东西更加防弹?
在等待(阻塞)可调用对象完成时,InterruptedException
将被get
抛出。
我不确定你所说的防弹是什么意思,你必须处理抛出异常的可能性
InterruptedException可以由调用get并等待完成的线程抛出,而不是由可调用的