多线程编程之Callable 与 FutureTask

版权声明:本文为博主原创文章,未经博主允许不得转载。 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 + "任务返回运行结果";
}
}  

猜你喜欢

转载自blog.csdn.net/luohaiqing123456/article/details/52232160