多线程-从Future对象中获取线程处理Callable方法的结果
来源:互联网 发布:连环夺宝编程原理 编辑:程序博客网 时间:2024/06/01 09:01
Runnable
接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run
的无参数方法。
以上为Runnable接口的描述,明确可以看出,实现Runnable子类的实例是被线程来运行的。但是看看run方法的定义为void,因此,获取run方法中的处理结果比较麻烦,这时候jdk1.5提供了解决办法。1.5之后提供了
java.util.concurrent
包,该包下面有个callable<V>接口,该接口是泛型接口,泛型类型就是你的返回值类型,下面是接口定义。
public interface Callable<V> { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute a result */ V call() throws Exception;}
可以看到和Runnable最大的区别就是由返回值类型。这个接口可以说完全是和Runnable一样的,区别是一个是有返回值一个是无返回值。
下面我们来实现它。
public class MyCall implements Callable<String> { @Override public String call() throws Exception { System.out.println("========="); return "return value 123"; }}
但是想想就算我们可以有返回值了,但是要如何获取这个返回值呢,也就是我们要在哪里 get()返回值呢?
Thread类中肯定是没有的,而且,如果我们new Thread类会发现没有构造函数参数为Callable<V>,这就比较尴尬了。
所以,如果让我们自己来做的话,那唯一的办法可能就是让某个类,实现Runable方法,然后这个实现类的run方法中调用callable,然后获取返回值。
实际上,Future就是这么做的,Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。
Future本身是个接口,因为我们需要用到它的实现类 FutureTask<V>
public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V>
以上类继承结构可以看出,FutureTask同时继承了Runable以及Future,也就意味着,FutureTask可以被线程运行,同时也可以获取到线程运行后的计算结果。
然后看FutureTask的构造函数。
以上构造函数很明显,FutureTask既可以获取线程的计算结果也可以不需要返回结果。
到这里我想我们可以自己来编写测试代码了。
FutureTask<String> future = new FutureTask<String>(new MyCall()); Thread thread = new Thread(future); thread.start(); System.out.println(future.get()); System.out.println(future.get());
输出:
=========
return value 123
return value 123
至于为什么只输出一遍=====,这就是我们之前说的,Future调用了Callable并且获取记录了返回值,而call方法他其实只走了一遍。
最后一图流。
参考资料
http://blog.csdn.net/ghsau/article/details/7451464
- 多线程-从Future对象中获取线程处理Callable方法的结果
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- java多线程获取结果 Callable和Future
- (五) Java多线程详解之Callable和Future阻塞获取线程返回结果
- JDK5中的Callable与Future的应用:获取一个线程的运行结果
- 多线程 : 使用 Future 获取线程返回结果
- Callable、Future多线程 线程池处理有返回值
- 多线程,线程池,使用CompletionService通过Future来处理Callable的返回
- java 使用Callable和Future返回线程执行的结果
- Callable 对象 Future异步计算 统计结果
- Java 多线程线程池 - Callable和Future
- Callable返回的Future对象
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没
- 携带结果的任务callable与future
- Java线程池及Future、Callable获得线程返回结果
- java线程中Callable与Future
- 使用ExecutorService、Callable、Future实现有返回结果的多线程 应用实例
- JS操作Cookie
- 数据结构-顺序表-c++语言-模板类实现代码(附详细解释) _清风明月
- shiro (java安全框架)
- jar包运行出现中文乱码的问题
- 软考错题合集之15-11-AM
- 多线程-从Future对象中获取线程处理Callable方法的结果
- java基础小知识(二)——LAB1问答题
- c语言题(1)
- 登录注册+接口
- zuul No route found for uri:
- 认识Linux数据重定向redirection
- 安卓蓝牙bluetooth开发全解
- 51nod 1089 最长回文子串 V2(Manacher算法)
- 动态代理模式和责任链模式