您的位置:首页 > 编程语言 > Java开发

Java并发编程-17-在执行器中执行任务并返回结果

2015-06-17 14:49 441 查看
一、在执行器中执行任务并返回结果

基于Callable接口和Future接口

Callable接口:这个接口声明了Call方法,可以在这个方法里面实现任务的具体逻辑操作。这个接口是一个范型接口,这就意味着必须声明call()方法返回的数据类型

Future接口:这个接口声明了一些方法来获取Callable对象产生的结果,并管理他们的状态

Callable接口:

@FunctionalInterface
public interface Callable<V> {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}


Future接口:



二、测试示例

计算阶乘,并返回结果

package com.concurrency.executor;

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

/**
* 这个类实现Callable接口,Callable接口的范型参数是Integer
* 实现call()方法,这个方法有返回值
* @author Nicholas
*
*/
public class FactorialCalculator implements Callable<Integer> {

private Integer number;

public FactorialCalculator(Integer number) {
this.number = number;
}

/**
* 相当于runnable的run()方法,但是可以又返回值
* 计算number的阶乘
*/
@Override
public Integer call() throws Exception {
int result = 1;
if ((number == 0) || (number == 1)) {
result = 1;
} else {
for (int i = 2; i <= number; i++) {
result *= i;
TimeUnit.MILLISECONDS.sleep(20);
}
}
System.out
.printf("%s : %d\n", Thread.currentThread().getName(), result);
return result;
}

}


 核心测试
/**
* 1、创建线程执行器,并指定最大的线程数
* 2、创建FactorialCalculator实例
* 3、调用ThreadPoolExecutor的submit()方法,将FactorialCalculator实例发送给线程执行器
* 4、submit()的返回值是一个Future()接口的对象
* 5、可以对这个结果进行监管
*/
public void testFactorialCalculator() {
// 最多创建两个线程执行器
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors
.newFixedThreadPool(2);
// 创建Future<Integer>类型的列表对象,用来保存结果
List<Future<Integer>> resulFutures = new ArrayList<Future<Integer>>();

Random random = new Random();
for (int i = 0; i < 10; i++) {
// 生成0~10之间的随机整数
Integer number = random.nextInt(10);

// 将这个整数传给FactorialCalculator类作为参数
FactorialCalculator factorialCalculator = new FactorialCalculator(
number);

// 调用threadPoolExecutor.submit()方法发送factorialCalculator任务给执行器threadPoolExecutor
// 这个方法返回一个Future<Integer>对象,这个对象是用来管理任务和得到最终的结果
Future<Integer> resultsFuture = threadPoolExecutor
.submit(factorialCalculator);

// 将结果加入到结果列表中
resulFutures.add(resultsFuture);
}

// 监控执行器的执行状态
do {
System.out.println("Main : Number of Completed Tasks : "
+ threadPoolExecutor.getCompletedTaskCount());
// 遍历resultList列表中的结果,调用isDone()方法来检查任务是否完成的信息
for (int i = 0; i < resulFutures.size(); i++) {
Future<Integer> result = resulFutures.get(i);
System.out.println("Main : Task " + i + " --- "
+ result.isDone());
}

// 线程休眠50毫秒
try {
TimeUnit.MILLISECONDS.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 若执行器中完成的任务数量小于10,则一直重复执行这个循环
} while (threadPoolExecutor.getCompletedTaskCount() < resulFutures
.size());

// 打印结果
System.out.println("Main : Results");
for (int i = 0; i < resulFutures.size(); i++) {
Future<Integer> result = resulFutures.get(i);
Integer number = null;
try {
number = result.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
System.out.println("Main : Task " + i + " --- " + number);
}
threadPoolExecutor.shutdown();
}

结果:
pool-1-thread-2 : 1
Main : Number of Completed Tasks : 0
Main : Task 0 --- false
Main : Task 1 --- true
Main : Task 2 --- false
Main : Task 3 --- false
Main : Task 4 --- false
Main : Task 5 --- false
Main : Task 6 --- false
Main : Task 7 --- false
Main : Task 8 --- false
Main : Task 9 --- false
Main : Number of Completed Tasks : 1
Main : Task 0 --- false
Main : Task 1 --- true
Main : Task 2 --- false
Main : Task 3 --- false
Main : Task 4 --- false
Main : Task 5 --- false
Main : Task 6 --- false
Main : Task 7 --- false
Main : Task 8 --- false
Main : Task 9 --- false
pool-1-thread-2 : 24
pool-1-thread-2 : 1
pool-1-thread-2 : 2
Main : Number of Completed Tasks : 4
Main : Task 0 --- false
Main : Task 1 --- true
Main : Task 2 --- true
Main : Task 3 --- true
Main : Task 4 --- true
Main : Task 5 --- false
Main : Task 6 --- false
Main : Task 7 --- false
Main : Task 8 --- false
Main : Task 9 --- false
pool-1-thread-1 : 362880
pool-1-thread-1 : 6
Main : Number of Completed Tasks : 6
Main : Task 0 --- true
Main : Task 1 --- true
Main : Task 2 --- true
Main : Task 3 --- true
Main : Task 4 --- true
Main : Task 5 --- false
Main : Task 6 --- true
Main : Task 7 --- false
Main : Task 8 --- false
Main : Task 9 --- false
Main : Number of Completed Tasks : 6
Main : Task 0 --- true
Main : Task 1 --- true
Main : Task 2 --- true
Main : Task 3 --- true
Main : Task 4 --- true
Main : Task 5 --- false
Main : Task 6 --- true
Main : Task 7 --- false
Main : Task 8 --- false
Main : Task 9 --- false
pool-1-thread-2 : 40320
pool-1-thread-2 : 2
Main : Number of Completed Tasks : 8
Main : Task 0 --- true
Main : Task 1 --- true
Main : Task 2 --- true
Main : Task 3 --- true
Main : Task 4 --- true
Main : Task 5 --- true
Main : Task 6 --- true
Main : Task 7 --- false
Main : Task 8 --- true
Main : Task 9 --- false
pool-1-thread-1 : 40320
Main : Number of Completed Tasks : 9
Main : Task 0 --- true
Main : Task 1 --- true
Main : Task 2 --- true
Main : Task 3 --- true
Main : Task 4 --- true
Main : Task 5 --- true
Main : Task 6 --- true
Main : Task 7 --- true
Main : Task 8 --- true
Main : Task 9 --- false
pool-1-thread-2 : 24
Main : Results
Main : Task 0 --- 362880
Main : Task 1 --- 1
Main : Task 2 --- 24
Main : Task 3 --- 1
Main : Task 4 --- 2
Main : Task 5 --- 40320
Main : Task 6 --- 6
Main : Task 7 --- 40320
Main : Task 8 --- 2
Main : Task 9 --- 24
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: