版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luohaiqing123456/article/details/52232160
FutureTask实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable和Future。
也就是说,它既可以作为Runnable被线程执行,
也可以作为Future得到Callable返回值
Callable与Runnable的功能大致相似,Callable中有一个call()函数,但是call()函数有返回值,而Runnable的run()函数不能将结果返回给客户程序。
package com.icardpay.business.quartz.test;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
public class Test {
public static void main(String[] args) throws ExecutionException,
InterruptedException {
System.out.println("----程序开始运行----");
int taskSize = 5;
// 创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(taskSize);
// 创建多个有返回值的任务
List<Future> list = new ArrayList<Future>();
for (int i = 0; i < taskSize; i++) {
Callable c = new CallableTest(i + " ");
//第一种方式 Callable+FutureTask
/*FutureTask futureTask = new FutureTask(c);
pool.submit(futureTask);
list.add(futureTask); */
//第二种方式 Callable+Future 分析两种方法不同之处就在于Future和FutureTask,其中一个是接口,一个是类
Future f=pool.submit(c);
list.add(f);
}
// 关闭线程池
pool.shutdown();
//判断线程池中线程是否都执行完成
while(true){
if(pool.isTerminated()){
System.out.println("所有的子线程都结束了!");
break;
}
}
// 获取所有并发任务的运行结果
for (Future f : list) {
// 从Future对象上获取任务的返回值,并输出到控制台
System.out.println(">>>" + f.get().toString());
}
}
}
class CallableTest implements Callable<Object> {
private String taskNum;
CallableTest(String taskNum) {
this.taskNum = taskNum;
}
public Object call() throws Exception {
System.out.println(">>>" + taskNum + "任务启动");
System.out.println(">>>" + taskNum + "任务终止");
return taskNum + "任务返回运行结果";
}
}