取得子线程的返回值(Future 搭载Callable)
来源:互联网 发布:dnf决战人工智能62 编辑:程序博客网 时间:2024/06/10 04:08
但是如果需要返回值的时候,就很麻烦,要用外部变量控制流程,或者新增接口监听等。
当到了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中来。
看上去好像更面向对象了,呵呵!
- 取得子线程的返回值(Future 搭载Callable)
- 带返回值的线程:Callable、Future和FutureTask
- JAVA 线程之带有返回值的Callable和Future
- 得到线程返回值Future、Callable
- java 线程池执行 callable 接口,future 接收callable 接口的返回值
- Java线程:线程安全类和Callable与Future(有返回值的线程)
- java线程:关于Callable和Future的简单使用:有返回值的线程
- java 使用Callable和Future返回线程执行的结果
- 使用callable获取子线程的返回值
- Callable、Future多线程 线程池处理有返回值
- Callable返回的Future对象
- Callable、Future接口实现原理,FutureTask 原理解析,获取线程的返回值
- Future和Callable、FutureTask实现,带有返回值的线程请求
- Java多线程研究06-带返回值的线程定义接口Callable以及Future,FutureTask的使用
- (8)java5线程 Callable与Future的应用
- (8)java5线程 Callable与Future的应用
- Java线程总结(十三):并发包------线程返回结果Callable和 Future
- Java线程池及Future、Callable获得线程返回结果
- C#控制Excel格式的方法
- mybatis写兼容不同数据库的sql
- 生成二维码方法----C#
- 如何线程安全地遍历List:Vector、CopyOnWriteArrayList
- 基于Mongodb进行分布式数据存储
- 取得子线程的返回值(Future 搭载Callable)
- UVA10305 Ordering Tasks 拓扑排序
- 【noip 2012】开车旅行 倍增+双端链表
- [Spring]一步步实现Spring AOP(二)
- 使用Spring管理,在try-catch后不会滚解决
- python中from module import * 的一个陷阱
- OkGO一个专注于让网络请求更简单的框架
- java面向对象浅析系列3——初识奇特的内部类
- ReactNative iOS上canOpenUrl为false