一、使用Callable+Future获取结果:
//实现有返回值的多线程
public class CallableTest {
/**
* @param args
* @throws ExecutionException
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException, ExecutionException {
System.out.println("程序开始执行");
Date ds = new Date();
//创建一个线程池,即指定同时启动多少个线程
ExecutorService pool=Executors.newFixedThreadPool(3);
//创建有多个返回值的任务
List<Future> ls=new ArrayList<Future>();
for(int i=0;i<=20;i++){
Callable c=new MyCallable(i+" "); //创建一个称为c的任务
//执行任务并获取Future对象,Future类提供了提供了检查计算是否完成的方法,等待计算完成并获取结算的结果
//pool.submit(c)提供一个有返回值的任务用于执行
Future f =pool.submit(c);
ls.add(f);
}
//关闭线程池
pool.shutdown();
//获取所有并发任务的运行结果,用Future对象获取计算计算
for(Future f :ls){
//从Future 对象上获取任务的返回值,并输出到控制台
System.out.println("程序返回结果:"+f.get().toString());
}
Date ds2 =new Date();
System.out.println("----程序结束运行----,程序运行时间【"+ (ds2.getTime() - ds.getTime()) + "毫秒】");
}
}
class MyCallable implements Callable<Object>{
private String taskNum;
MyCallable(String taskNum ){
this.taskNum=taskNum;
}
@Override
public Object call() throws Exception {
System.out.println(taskNum+"任务启动");
Date ds=new Date();
Thread.sleep(1000);
Date ds1= new Date();
long time=ds1.getTime()-ds.getTime();
System.out.println(taskNum+"任务结束");
return taskNum+"任务返回结果,当前任务时间"+time;
}
}
详见:http://www.cnblogs.com/dolphin0520/p/3949310.html