设为首页 加入收藏

TOP

源码 | 批量执行invokeAll() && 多选一invokeAny()(三)
2017-12-07 14:22:10 】 浏览:793
Tags:源码 批量 执行 invokeAll invokeAny
有已提交未结束的任务,且开启了超时机制,则尝试使用超时版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有并列的判断关系,非此即彼
    • 结构更清爽
    首页 上一页 1 2 3 下一页 尾页 3/3/3
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇Redis 分布式锁的正确实现方式( .. 下一篇使用 Spock 框架进行单元测试

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目