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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

执行器框架给我们提供了一个方法,让我们可以发送给执行器一个任务列表,并等待任务列表中的所有任务执行完毕。然后它将返回一个与任务列表对应的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 {
    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 tasks = new ArrayList();

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

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

            executor.shutdown();

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

            for (Future 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");
    }
}

转载于:https://my.oschina.net/nenusoul/blog/849156

你可能感兴趣的:(Java并发编程高级篇(五):运行多个任务并处理所有结果)