资讯专栏INFORMATION COLUMN

批量Future模式

remcarpediem / 1661人阅读

摘要:批量在模式的讲解中,说到模式是一种支持异步计算并可以返回计算结果,并在返回结果前可以阻塞调用者的线程对象模型。批量模式是在对模式的扩展。

批量 FutureTask

在Future模式的讲解中,说到future模式是一种支持异步计算并可以返回计算结果,并在返回结果前可以阻塞调用者的线程对象模型。
批量Future模式是在对Future模式的扩展。比如有,一批FutureTask,我要把这批task打包到一起,等待整个任务包执行完后,在返回给调用者,或在规定时间内返回计算结果。

在Jdk中实现的方法是:

// 支持超时的批量任务模式
 List> invokeAll(Collection> tasks,
                                  long timeout, TimeUnit unit)
        throws InterruptedException;
        
 List> invokeAll(Collection> tasks)
        throws InterruptedException;
JDK的一种简单实现方式

Jdk在实现这种模式时,用了一个ArrayList存放task包,每个task还是多带带的送入到调度器中,然后在等待每个task的计算结果,等到所有的task计算完成后在返回包含每个task的计算结果集合,否则阻塞当前调用线程

下面是jdk的实现源码:

public  List> invokeAll(Collection> tasks)
        throws InterruptedException {
        if (tasks == null)
            throw new NullPointerException();
            
        // 存放task的集合    
        List> futures = new ArrayList>(tasks.size());
        boolean done = false;
        try {
        
            // 每个task都送入到调度器
            for (Callable t : tasks) {
                RunnableFuture f = newTaskFor(t);
                futures.add(f);
                execute(f);
            }
            
            // 等待每一个task返回计算结果
            for (Future f : futures) {
                if (!f.isDone()) {
                    try {
                        f.get();
                    } catch (CancellationException ignore) {
                        // 如果其中有task被取消了,则忽略
                    } catch (ExecutionException ignore) {
                    }
                }
            }
            done = true;
            return futures;
        } finally {
            if (!done)
                for (Future f : futures)
                    f.cancel(true);
        }
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64703.html

相关文章

  • Java 8 并发: Threads 和 Executors

    摘要:能够异步的执行任务,并且通常管理一个线程池。这样我们就不用手动的去创建线程了,线程池中的所有线程都将被重用。在之后不能再提交任务到线程池。它不使用固定大小的线程池,默认情况下是主机的可用内核数。 原文地址: Java 8 Concurrency Tutorial: Threads and Executors Java 5 初次引入了Concurrency API,并在随后的发布版本中...

    J4ck_Chan 评论0 收藏0
  • Java 8 并发教程:线程和执行器

    摘要:在这个示例中我们使用了一个单线程线程池的。在延迟消逝后,任务将会并发执行。这是并发系列教程的第一部分。第一部分线程和执行器第二部分同步和锁第三部分原子操作和 Java 8 并发教程:线程和执行器 原文:Java 8 Concurrency Tutorial: Threads and Executors 译者:BlankKelly 来源:Java8并发教程:Threads和Execut...

    jsdt 评论0 收藏0
  • python并发 1:使用 futures 处理并发

    摘要:标准库中所有阻塞型函数都会释放,允许其他线程运行。如果调用引发异常,那么当从迭代器检索其值时,将引发异常。总结自版就支持线程了,只不过是使用线程的最新方式。类封装了模块的组件,使使用线程变得更加方便。下一篇笔记应该是使用处理并发。 作为Python程序员,平时很少使用并发编程,偶尔使用也只需要派生出一批独立的线程,然后放到队列中,批量执行。所以,不夸张的说,虽然我知道线程、进程、并行、...

    Kyxy 评论0 收藏0
  • java线程池的基本使用

    摘要:此外,有两个常用的关闭线程池的方法第一个方法将启动一次顺序关闭,有任务在执行,则等待执行完成,但不接受新的任务第二个方法将取消所有未开始的任务并且试图中断正在执行的任务,返回从未开始执行的任务的列表。 四种线程池 在Executors中提供了四种线程池: newCachedThreadPool 可缓存线程池,对于每个线程,如果有空闲线程可用,立即让它执行,如果没有,则创建一个新线...

    sf190404 评论0 收藏0
  • 你见过的最全面的python重点

    摘要:前端设置上下无效果,因为是行内元素,是没有宽高的。求该青蛙跳上一个级的台阶总共有多少种跳法。 首先和大家说个对不起,由于总结了太多的东西,所以篇幅有点长,这也是我缝缝补补总结了好久的东西,对于Nginx的东西我没总结在这里,大家可以Python聚焦看,点击直达专栏哦。 前端 span设置margin上下无效果,因为span是行内元素,是没有宽高的。 Py2 VS Py3 print成...

    ISherry 评论0 收藏0

发表评论

0条评论

remcarpediem

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<