热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为多个任务设置时限invokeAll

在有限时间内执行任务的主要困难在于,要确保得到答案的时间不会超过限定的时间,或者在限定的时间内无法获得答案。在支持时间限制的Future.get中支持这种需求;当结果可用时,它将立

在有限时间内执行任务的主要困难在于,要确保得到答案的时间不会超过限定的时间,或者在限定的时间内无法获得答案。在支持时间限制的Future.get中支持这种需求;当结果可用时,它将立即返回,如果在指定时限内没有计算出结果,那么将抛出TimeoutException。

在使用限时任务时需要注意,当这些任务超时后应该立即停止,从而避免为继续计算一个不再使用的结果而浪费计算资源。要实现这个功能,可以由任务本身来管理的它的限定时间,并且在超时后中止执行或取消任务。此时可再次使用Future,如果一个限时的get方法抛出了TimeoutException,那么可以通过Future来取消任务。

我们思考这么一个例子:

在某个旅游网站上,门户网站获取并限时来自多条航线,旅店或汽车租赁公司的报价,在获取不同公司报价的过程中,可能会调用web服务,访问数据库,执行一个EDI事务或其他机制。在这种情况下,不宜让页面的响应时间受限于最慢的响应时间,而应该只显示在指定时间内收到的信息。对于没有及时响应的服务提供者,页面可以忽略他们,或者显示一个提示信息。

从一个公司获得报价的过程与从其他公司获得报价的过程无关,因此可以将获取报价的过程当成一个任务,从而使获得报价的过程能并发执行。

创建n个任务,将其提交到一个线程池,保留n个Future,并使用限时的get方法通过Future串行地获取每一个结果,这一切都很简单,但还有一个更简单的方法——invokeAll.

package com.citi.test.mutiplethread.demo5.invokeall;

import java.util.concurrent.Callable;

public class CallableTest implements Callable {
    @Override
    public Integer call() throws Exception {
        Thread.sleep((long) (Math.random()*10000));
        return (int) (Math.random()*1000);
    }
}
package com.citi.test.mutiplethread.demo5.invokeall;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

import com.sun.corba.se.impl.orbutil.threadpool.TimeoutException;

public class TestMain {
    public static void main(String[] args) {
        List tasks=new ArrayList();
        for(int i=0;i<10;i++){
            tasks.add(new CallableTest());
        }
        ExecutorService executor=Executors.newCachedThreadPool();
        try {
            List> invokeAll = executor.invokeAll(tasks,3,TimeUnit.SECONDS);
            for(Future future:invokeAll){
                System.out.println(future.get());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (CancellationException e) {
            e.printStackTrace();
            System.out.println("aaa");
        }
        executor.shutdown();
    }
}

下面是执行结果。 可以看到当到3秒之后,已经完成了两个任务,其他的都被取消了,最终抛出CancellationException.

技术图片

invokeAll 原理:

使用了支持限时的invokeAll,将多个任务提交到一个ExecutorService并获得结果,invokeAll方法的参数为一组任务,并返回一组Future。这两个集合有着相同的结构。

invokeAll按照任务集合中迭代器的顺序将所有的Future添加到返回的集合中,从而使调用者能将各个Future与其表示的Callable关联起来。

当所有任务都执行完毕时,或者调用线程被中断时,又或者超过指定时限时,invokeAll将返回。

当超过指定时限后,任何还未完成的任务都会取消。

当invoke返回后,每个任务要么正常的完成,要么被取消,而客户端代码可以调用get或isCancelled来判断究竟是何种情况。

为多个任务设置时限invokeAll


推荐阅读
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 本文详细探讨了Java中的包管理机制,包括默认包的使用和自定义包名的创建方法。通过实际操作,帮助开发者更好地理解和应用包管理。 ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 本文详细介绍了一种高效的算法——线性筛法,用于快速筛选出一定范围内的所有素数。通过该方法,可以显著提高求解素数问题的效率。 ... [详细]
  • 本文详细介绍了get和set方法的作用及其在编程中的实现方式,同时探讨了点语法的使用场景。通过具体示例,解释了属性声明与合成存取方法的概念,并补充了相关操作的最佳实践。 ... [详细]
  • Vue 开发与调试工具指南
    本文介绍了如何使用 Vue 调试工具,包括克隆仓库、安装依赖包、构建项目以及在 Chrome 浏览器中加载扩展的详细步骤。 ... [详细]
  • Java中的基本数据类型与包装类解析
    本文探讨了Java编程语言中的8种基本数据类型及其对应的包装类。通过分析这些数据类型的特性和使用场景,以及自动拆装箱机制的实现原理,帮助开发者更好地理解和应用这些概念。 ... [详细]
  • 本文详细介绍了 Android 开发中 layout_gravity 属性的使用方法及其在不同布局下的效果,旨在帮助开发者更好地理解和利用这一属性来精确控制视图的布局。 ... [详细]
  • 本文深入探讨了 Exchange Server 2010 中客户端访问的代理和重定向机制,特别是在跨站点环境中如何配置这些功能以确保用户能够顺利访问邮箱服务。通过详细解析不同场景下的应用,帮助管理员更好地理解和实施相关设置。 ... [详细]
  • 编写css让div2在div1的右下角? ... [详细]
  • 本文介绍了如何通过在数据库表中增加一个字段来记录文章的访问次数,并提供了一个示例方法用于更新该字段值。 ... [详细]
  • Python notes
    6.1.1.执行模块当你用下面的方式运行一个Python模块pythonfibo.py模块中的代码将会被执行,就像导入它一样,不过此时__name__被设置为__main__。 ... [详细]
  • 本文探讨了过度依赖咖啡对生物钟的影响,以及如何合理划分学习和娱乐时间。通过反思,我们认识到即使是快乐的事情也需要适度,培养兴趣爱好应注重沉浸感和心流体验。文章还提供了一些具体的调整建议。 ... [详细]
  • 解决Spring Boot项目创建失败的问题
    在尝试创建新的Spring Boot项目时遇到了一些问题,具体表现为在项目创建过程中的两个关键步骤出现错误。本文将详细探讨这些问题及其解决方案。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有