但是如果需要返回值的时候,就很麻烦,要用外部变量控制流程,或者新增接口监听等。
当到了java1.5之后,就可以用Future搭载 Callable的方式来简单解决!
贴上代码:
public class CallableFutureTest
{
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) throws ExecutionException,
InterruptedException {
//创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(1);
//创建两个有返回值的任务
Callable mCallable = new CallableImpl("线程AAAA");
//执行任务并获取Future对象
Future mFuture = pool.submit(mCallable);
//从Future对象上获取任务的返回值,并输出到控制台
System.out.println(">>>" + mFuture.get().toString());
//关闭线程池
pool.shutdown();
}
@SuppressWarnings("rawtypes")
class CallableImpl implements Callable {
private String name;
CallableImpl(String name) {
this.name = name;
}
public Object call() throws Exception {
return name + "线程返回的内容";
}
}
}
代码分析:
首先,实现一个Callable 的接口CallableImpl, 看名字就有点类似Runnable。 Callable的接口会实现一个call函数,就是通过这个函数就是返回返回值。
其次, 新建一个线程池
//创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(1);
第三 ,实现一个Callable的对象,通过new CallableImpl来实现
//创建两个有返回值的任务
Callable mCallable = test.new CallableImpl("线程A");
第四, 将Callable 的对象也就是mCallable 放到线程池中
//执行任务并获取Future对象
Future mFuture = pool.submit(mCallable);
这个submit会返回Future类型的对象
第五 通过 mFuture.get()就取到返回值了
//从Future对象上获取任务的返回值,并输出到控制台
System.out.println(">>>" + mFuture.get().toString());
最后,记得要关闭线程池哦!
//关闭线程池
pool.shutdown();
其实还有一个叫FutureTask的方法,事实上FutureTask是JDK中对Future接口的唯一实现。
FutureTask跟Future的用法区别是不需要通过submit的返回值!
譬如将上面的代码中要把第四步的:
Future mFuture = pool.submit(mCallable);
换成
FutureTask<String> mFutureTask = new FutureTask<String>(mCallable);
pool.submit(mFutureTask);
就行
同样可以通过mFutureTask.get()取得返回值!
总结:
FutureTask 的作用其实就是将 Callable对象打包到FutureTask中来。
看上去好像更面向对象了,呵呵!