FutureTask是真正工作的处理类,实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable和Future接口,所以FutureTask既可以作为Runnable被Thread执行,也可以获取Future异步执行的结果; FutureTask两个构造方法,一个接收Callable的参数实例,另一个接收Runnable的参数实例 当传入的参数是Runnable时,通过Executors.callable(runnable...
FutureTask实现了RunnableFuture接口,而RunnableFuture接口实际上仅仅是Runnable接口和Future接口的合体。Future接口提供取消任务、检测任务是否执行完成、等待任务执行完成获得结果等方法。从图中可以看出,FutureTask类中的run方法已经实现好了(图中的代码仅仅是核心代码),这个run方法实际上就是调用了由构造函数传递进来的call方...
简单来说,Executor就是Runnable和Callable的调度容器,Future就是对于具体的调度任务的执行结果进行查看,最为关键的是Future可以检查对应的任务是否已经完成,也可以阻塞在get方法上一直等待任务返回结果。Runnable和Callable的差别就是Runnable是没有结果可以返回的,就算是通过Future也看不到任务调度的结果的。 /** * 通过简...
接下来我们在看一个接口RunnableFuture接口,它继承了Runnable接口和Future接口,而FutureTask实现了RunableFuture接口,所以它既可以作为Runable被线程执行,又可以作为Future得到Callable的返回值。 画一个类图简单明了,亿图软件画的 我们通过一个线程运行Callable,但是Thread目前不支持构造方法传递Callable实例,所以我们需要通过Futu...
Callable与Runnable、Future、FutureTask无继承关系。 FutureTask带了Future和Runnable的功能。 Runnable...png 2:Runnable和Callable // JDK1.0 不接受参数、无返回值,单线程、线程池均可使用。publicinterfaceRunnable{publicabstractvoidrun();}// JDK 1.5 不接受参数、有返回值,仅供线程池使用。publicinterfaceCallable...
Callable Callable 也可以用来实现线程,采用 Callable 方式执行线程,我们可以得到线程的一个执行结果,线程的执行结果通过 Future 进行返回; Callable 和 Runnable 类似,都是为了线程而设计,但是 Runnable 的 run 方法执行线程后不能返回结果,也不能抛出异常;而 Callable 的 call 方法可以有返回值和抛出异常。
并且get等待结果时会阻塞,所以当任务之间有依赖关系的时候,一个任务依赖另一个任务的结果,可以用Future的get来等待依赖的任务完成的结果。 FutureTask 就是具体的实现类,有Runnable 的特性又有Future的特性,内部包的是Callable ,当然也有接受Runnable 的构造器,只是会偷偷把Runnable 转成Callable 来实现能返回结果的方法...
Future是一个接口,而FutureTask是Future接口的官方唯一实现类。 1、Future接口 Future以及其实现类,是用于搭载Runnable或者Callable,执行任务、控制任务并能有效返回结果。 Future接口内容如下(去了注释): [html]view plaincopy package java.util.concurrent;
1.3 Thread 和 Runnable 的关系 2. Callable 、Future 和 FutureTask 2.1 Callable 2.2 FutureTask 2.3 Callable 和 FutureTask 的关系 2.4 Future 3. 具体实例 前言 大家好,我是月夜枫,我又来了!!! Thread、Runnable、Callable、Future、FutureTask,你能详细讲出他们的内部关系么?这也是面试经常问到的问题。
//线程可以用我们常用的Runnable接口实现,但是这样没有返回值,如果想要线程运行结果,可以使用Callable、Future、FutureTask使用 1. Runnable ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { executorService.submit(new RunTask()); ...