线程执行者(六)运行多个任务并处理所有结果
运行多个任务并处理所有结果
执行者框架允许你在不用担心线程创建和执行的情况下,并发的执行任务。它还提供了Future类,这个类可以用来控制任务的状态,也可以用来获得执行者执行任务的结果。
如果你想要等待一个任务完成,你可以使用以下两种方法:
如果任务执行完成,Future接口的isDone()方法将返回true。 ThreadPoolExecutor类的awaitTermination()方法使线程进入睡眠,直到每一个任务调用shutdown()方法之后完成执行。这两种方法都有一些缺点。第一个方法,你只能控制一个任务的完成。第二个方法,你必须等待一个线程来关闭执行者,否则这个方法的调用立即返回。
ThreadPoolExecutor类提供一个方法,允许你提交任务列表给执行者,并且在这个列表上等待所有任务的完成。在这个指南中,你将学习如何使用这个特性,实现一个示例,执行3个任务,并且当它们完成时将结果打印出来。
准备工作…
这个指南的例子使用Eclipse IDE实现。如果你使用Eclipse或其他IDE,如NetBeans,打开它并创建一个新的Java项目。
如何做…
按以下步骤来实现的这个例子:
1.创建Result类,存储这个示例中并发任务产生的结果。
18.调用ThreadPoolExecutor类的invokeAll()方法。这个类将会返回之前创建的Future对象列表。
它是如何工作的…
在这个指南中,你已经学习了如何提交任务列表到执行者和使用invokeAll()方法等待它们的完成。这个方法接收Callable对象列表和返回 Future对象列表。这个列表将会有列表中每个任务的一个Future对象。Future对象列表的第一个对象是Callable对象列表控制的第一个任务,以此类推。
第一点要考虑的是,在存储结果对象的列表中声明的Future接口参数化的数据类型必须与使用的Callable对象的参数化相兼容。在本例中,你已经使用相同数据类型:Result类型。
另一个重要的一点就是关于invokeAll()方法,你会使用Future对象获取任务的结果。当所有的任务完成时,这个方法结束,如果你调用返回的Future对象的isDone()方法,所有调用都将返回true值。
不止这些…
ExecutorService类提供其他版本的invokeAll()方法:
invokeAll(Collection ? extends Callable T tasks, long timeout,TimeUnit unit):此方法执行所有任务,当它们全部完成且未超时,返回它们的执行结果。TimeUnit类是个枚举类,有如下常量:DAYS,HOURS,MICROSECONDS, MILLISECONDS, MINUTES,,NANOSECONDS 和SECONDS。参见
在第4章,线程执行者中的执行者执行返回结果的任务指南 在第4章,线程执行者中的运行多个任务并处理第一个结果指南线程执行者(六)运行多个任务并处理所有结果 声明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González 译者:许巧辉 校对:方腾飞,叶磊 运行多个任务并处理所有结果 执行者框架允许你在不用担心线程创建和执行的情况下,并发的执行任务。
线程执行者(七)执行者延迟运行一个任务 声明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González 译者:许巧辉 校对:方腾飞,叶磊 执行者延迟运行一个任务 执行者框架提供ThreadPoolExecutor类,使用池中的线程来执行Callable和Runnable任务,这样可以避免所有线程的创建操作。
ali清英 方腾飞,花名清英,英文名kiral,并发编程网创始人,支付宝技术专家,《Java并发编程的艺术》作者。
相关文章
- 《CLR via C#》笔记:第5部分 线程处理(1)
- 千万不要把Request传递到异步线程里面!有坑!
- 这里有线程池、局部变量、内部类、静态嵌套类和一个莫得名堂的引用,哦,还有一个坑!
- 你知道线程池的 创建方式、7大参数、处理流程 和 最大线程数量该如何配置吗
- pthread_create 线程属性-Pthread并发编程之线程基本元素和状态的剖析
- Java 多线程 (Part2: Java线程 Lock锁)
- Golang实现线程安全的懒汉式单例模式
- 【Android RTMP】x264 图像数据编码 ( Camera 图像数据采集 | NV21 图像数据传到 Native 处理 | JNI 传输字节数组 | 局部引用变量处理 | 线程互斥 )
- 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )
- SQLServer 错误 8642 查询处理器未能为执行并行查询启动必要的线程资源。 故障 处理 修复 支持远程
- 2018 Java线程热门面试题,你知道多少详解编程语言
- 深入理解Java之线程池详解编程语言
- 『Linux下的并行任务处理机制』(linux任务线程)
- Linux线程:实现异步处理的高效方案(linux线程异步)
- 利用Redis队列加快线程处理效率(redis队列线程数)
- Android中断线程的处理方法