有已提交未结束的任务,且开启了超时机制,则尝试使用超时版poll()等待任务完成。但是,如果这种情况下超时了,就表示整个invokeAny()方法超时了,所以poll()返回null的时候,要主动抛出TimeoutException。
check4:如果可以没有剩余任务,但还有已提交未结束的任务,且未开启超时机制,则使用无限阻塞的take()方法,等待任务完成。
这种一堆if-else的代码很丑。可修改如下:
>if (f == null) { // check1
> if (ntasks > 0) {
> --ntasks;
> futures.add(ecs.submit(it.next()));
> ++active;
> continue;
> }
> if (active == 0) { // check2
> assert ntasks == 0; // 防止自己改吧改吧把它这句判断挪到了前面
> break;
> }
> if (timed) { // check3
> f = ecs.poll(nanos, TimeUnit.NANOSECONDS);
> if (f == null) {
> throw new TimeoutException();
> }
> nanos = deadline - System.nanoTime();
> } else { // check4
> f = ecs.take();
> }
>}
>
修改依据:
- check1、check2、check3/check4没有并列的判断关系
- check3、check4有并列的判断关系,非此即彼
- 结构更清爽