文档章节

Java并发编程高级篇(五):运行多个任务并处理所有结果

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2017/03/02 09:34
字数 521
阅读 246
收藏 0

执行器框架给我们提供了一个方法,让我们可以发送给执行器一个任务列表,并等待任务列表中的所有任务执行完毕。然后它将返回一个与任务列表对应的Future列表。

下面我们来看一下这个invokeAll方法怎么用。

首先我们创建一个Result类,用于保存任务执行结果。

/**
 * 创建Result类,作为Callable接口实现call()方法的返回值类型
 *
 * Created by hadoop on 2016/11/2.
 */
public class Result {
    private String name;
    private int value;

    public Result(String name, int value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public int getValue() {
        return value;
    }
}

接下来我们实现Callable接口,然后实现任务逻辑。随机等待一段时间来模拟任务的执行过程,然后求得一个随机数,并返回Result。

import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;

/**
 * Created by hadoop on 2016/11/2.
 */
public class Task implements Callable<Result> {
    private String name;

    public Task(String name) {
        this.name = name;
    }

    @Override
    public Result call() throws Exception {
        long duration = (long) (Math.random() * 10);

        System.out.printf("%s: Starting and Waiting %d seconds for results.\n", this.name, duration);

        TimeUnit.SECONDS.sleep(duration);

        int value = 0;

        for (int i = 0; i < 5; i++) {
            value += (int) (Math.random() * 100);
        }

        return new Result(this.name, value);
    }
}

最后看一下主方法类,我们创建三个任务实例,并加入到任务列表中。然后调用invokeAll方法来执行这个任务列表,并接受一个Future列表返回值,并打印返回值结果。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * 运行多个任务并处理全部结果
 *
 * 该范例的关键点在于调用了ExecutorService的invokeAll()方法。
 * 这个方法接收一个实现了Callable接口的任务列表,然后等待所有任务完成,并返回一个Future列表。
 *
 * Created by hadoop on 2016/11/2.
 */
public class Main {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newCachedThreadPool();

        List<Task> tasks = new ArrayList<Task>();

        for (int i = 0; i < 3; i++) {
            tasks.add(new Task(String.valueOf(i)));
        }

        try {
            List<Future<Result>> futures = executor.invokeAll(tasks);
            //List<Future<Result>> futures = executor.invokeAll(tasks, 2, TimeUnit.SECONDS);

            executor.shutdown();

            System.out.printf("Main: Start print resutls\n");

            for (Future<Result> future : futures) {
                System.out.printf("%s : %s\n", future.get().getName(), future.get().getValue());
                //System.out.println(future.isCancelled());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.printf("Main: End of programe.\n");
    }
}

© 著作权归作者所有

阿拉德大陆的魔法师
粉丝 27
博文 91
码字总数 83019
作品 0
西城
程序员
私信 提问
Java 编程之美:并发编程基础晋级篇

本文来自作者 加多 在 GitChat 上分享 「Java 并发编程之美:并发编程基础晋级篇」 编辑 | Mc Jin 借用 Java 并发编程实践中的话,编写正确的程序并不容易,而编写正常的并发程序就更难了! ...

gitchat
2018/04/18
0
0
Java线程面试题 Top 50

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者...

loda0128
2015/05/29
966
1
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
737
1
安卓中高级开发工程师面试之——面试永远逃不掉的Java线程面试题

不管你是Java工程师还是安卓开发工程师,只要你是计算机开发工程师,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大...

小饼干的梦
2018/10/12
0
0
JAVA多线程和并发基础面试问答

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。(校对注:...

LCZ777
2014/05/26
193
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot 操作ActiveMQ

一、消息队列中间件介绍 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的...

zw965
11分钟前
3
0
本地化存储Storage

为什么会引入Storage(sessionStorage,localStorage,globalStorage) Web storage的目的是克服由cookie带来的限制,当数据需要严格控制在客户端上时,无须持续将数据发回服务器。主要是提供一...

五公里
20分钟前
5
0
Qt编写自定义控件57-直方波形图

一、前言 直方波形图控件非原创控件,控件大全中大概有20-30个控件非自己原创,而是参考了网上开源的代码,自己加以整理和完善,新增了插件的代码使得可以直接集成到QtDesigner或者QtCreator...

飞扬青云
20分钟前
2
0
或许你不知道的10条SQL技巧

这几天在写索引,想到一些有意思的TIPS,希望大家有收获。 一、一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不...

mskk
26分钟前
5
0
IntelliJ IDEA (Mac) 运行速度优化(JVM+localhost)

1.1. JVM 参数配置 打开 idea,菜单 –> help –> edit custom vm options,调整参数,重启即可。 具体调整参数: -Xms2g -Xmx2g -XX:ReservedCodeCacheSize=1024m -XX:+UseCompressedOops 1......

指尖Coding
35分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部