Java并发编程之线程治理(Executor框架14)

Java并发编程之线程管理(Executor框架14)

4.4运行并发任务并返回所有运行结果

ThreadPoolExecutor提供了一个方法,它允许你发送给executor一列的任务链表,并且等待这些任务的终结。请看下面实例。

Result类的定义如下所示:

 

/**
 * This class stores the resultgenerated by one task
 *
 */
public class Result {
    /**
     * The name of the task that generates theresult
     */
    private String name;
    /**
     * The value of the task that generates theresult
     */
    private intvalue;
   
    /**
     * Returns the name of the task
     * @return Name of the task that generates the result
     */
    public String getName() {
        return name;
    }
   
    /**
     * Establish the name of the task
     * @param name The name of the task that generates the result
     */
    public voidsetName(String name) {
        this.name = name;
    }
   
    /**
     * Returns the value of the result
     * @return The value of the result
     */
    public intgetValue() {
        return value;
    }
   
    /**
     * Establish the value of the result
     * @param value The value of the result
     */
    public voidsetValue(intvalue) {
        this.value = value;
    }
   
}

定义Task类,实现必要的逻辑。

 

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
importjava.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
 
/**
 * This class implements the task ofthis example. It waits during a random
 * period of time and then calculatethe sum of five random numbers
 *
 */
public class Task implements Callable<Result> {
 
    /**
     * The name of the Task
     */
    private String name;
   
    /**
     * Constructor of the class
     * @param name Initializes the name of the task
     */
    public Task(String name) {
        this.name=name;
    }
   
    /**
     * Main method of the task. Waits during arandom period of time and then
     * calculates the sum of five random numbers
     */
    @Override
    public Result call() throws Exception {
        // Writes a message to the console
        System.out.printf("%s: Staring\n",this.name);
       
        // Waits during a random period of time
        try {
            Long duration=(long)(Math.random()*10);
            System.out.printf("%s: Waiting %d seconds for results.\n",this.name,duration);
            TimeUnit.SECONDS.sleep(duration);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }      
       
        // Calculates the sum of five random numbers
        int value=0;
        for (int i=0; i<5; i++){
            value+=(int)(Math.random()*100);
 
        }
       
        // Creates the object with the results
        Result result=new Result();
        result.setName(this.name);
        result.setValue(value);
        System.out.printf("%s: Ends\n",this.name);
 
        // Returns the result object
        return result;
    }
 
    public staticvoidmain(String []args){
 
        // Create an executor
        ExecutorServiceexecutor=(ExecutorService)Executors.newCachedThreadPool();
 
        // Create three tasks and stores them in a List
        List<Task> taskList=newArrayList<Task>();
        for (int i=0; i<3; i++){
            Task task=new Task("Task-"+i);
            taskList.add(task);
        }
 
        // Call the invokeAll() method
        List<Future<Result>>resultList=null;
        try {
            resultList=executor.invokeAll(taskList);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // Finish the executor
        executor.shutdown();
       
        // Writes the results to the console
        System.out.printf("Core: Printing the results\n");
        for (int i=0; i<resultList.size(); i++){
            Future<Result>future=resultList.get(i);
            try {
                Result result=future.get();
                System.out.printf("%s: %s\n",result.getName(),result.getValue());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
   
}

运行结果:

Task-0:Staring
Task-2:Staring
Task-1:Staring
Task-2:Waiting 3 seconds for results.
Task-0:Waiting 0 seconds for results.
Task-1:Waiting 4 seconds for results.
Task-0:Ends
Task-2:Ends
Task-1:Ends
Core:Printing the results
Task-0:175
Task-1:206
Task-2: 101