线程之Callable、Future 和FutureTask使用及源码分析

一、Callable

我们知道启动线程有以下两种方式(jdk源码注释中官方定义只有两种启动方式,callable不算线程启动方式) 原文链接:http://www.studyshare.cn/blog-front/blog/details/1141

(1)、new Thread().start()

(2)、new Thread(new Runnable()).start();

以上两种方式中的run()方法的返回值是void类型,即没有返回值,如果我们需要在业务线程中执行业务代码后需要将结果进行返回怎么办呢?即使用Callable,如下:

二、调用方式

当使用Callable定义后如何调用,我们发现Thread类并没有接收Callable参数的构造方法,只有接收Runnable接口参数的构造方法,此时我们需要用到一个包装类FutrueTask将Callable进行包装,包装成Runnable,然后传递给Thread的构造方法即可。

运行后结果输出:1

三、FutrueTask与Future源码分析

1、FutrueTask类实现了RunnableFutrue接口,如下图

2、RunnableFutrue接口继承了Runnable和Futrue接口,如下图

由上图即可发现,FutrueTask类间接的实现了Runnable接口,从而可以使用new Thread(new FutrueTask(callable))去调用线程的start()方法启动线程。

3、继续进入Future接口中会发现get()方法

因此FutrueTask可以通过调用get()方法获取到返回的结果。用一张图来总结以上几个类和接口之间的关系,如下图:

更多深度技术好文:http://www.studyshare.cn/blog-front//index

原文地址:https://www.cnblogs.com/darendu/p/10778671.html

时间: 2024-10-17 22:39:42

线程之Callable、Future 和FutureTask使用及源码分析的相关文章

Java异步编程——深入源码分析FutureTask

Java的异步编程是一项非常常用的多线程技术. 之前通过源码详细分析了ThreadPoolExecutor<你真的懂ThreadPoolExecutor线程池技术吗?看了源码你会有全新的认识>.通过创建一个ThreadPoolExecutor,往里面丢任务就可以实现多线程异步执行了. 但之前的任务主要倾向于线程池,并没有讲到异步编程方面的内容.本文将通过介绍Executor+Future框架(FutureTask是实现的核心),来深入了解下Java的异步编程. 万事从示例开始,我们先通过示例D

Tornado源码分析系列之一: 化异步为&#39;同步&#39;的Future和gen.coroutine

转自:http://blog.nathon.wang/2015/06/24/tornado-source-insight-01-gen/ 用Tornado也有一段时间,Tornado的文档还是比较匮乏的,但是幸好其代码短小精悍,很有可读性,遇到问题时总是习惯深入到其源码中.这对于提升自己的Python水平和对于网络及HTTP的协议的理解也很有帮助.本文是Tornado源码系列的第一篇文章,网上关于Tornado源码分析的文章也不少,大多是从Event loop入手,分析Event loop的工作

java多线程之Callable、Future和FutureTask

Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 今天我们就来讨论一下Callabl

Java线程之Callable和Future

本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果.        Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值, 下面来看一个简单的例子: 1 public class CallableAndFuture { 2 public sta

Java Future源码分析

JDK future框架,提供了一种异步编程模式,基于线程池的.将任务runnable/callable提交到线程池executor,返回一个Future对象.通过future.get()获取执行结果,这里提交到线程池,后面的操作不会阻塞.future.get()获取结果会阻塞,其实也是用多线线程执行任务. future.get()这里会阻塞,google的guava提供了一个calllback解决办法,这也是我准备看的 下面是一个future的demo import java.util.con

JDK源码分析之concurrent包(三) -- Future方式的实现

上一篇我们基于JDK的源码对线程池ThreadPoolExecutor的实现做了分析,本篇来对Executor框架中另一种典型用法Future方式做源码解读.我们知道Future方式实现了带有返回值的程序的异步调用,关于异步调用的场景大家可以自行脑补Ajax的应用(获取返回结果的方式不同,Future是主动询问获取,Ajax是回调函数),这里不做过多说明. 在进入源码前,首先来看下Future方式相关的API: 接口Callable:有返回结果并且可能抛出异常的任务: 接口Future:表示异步

Future Promise 模式(netty源码9)

netty源码死磕9  Future Promise 模式详解 1. Future/Promise 模式 1.1. ChannelFuture的由来 由于Netty中的Handler 处理都是异步IO操作,结果是未知的. Netty继承和扩展了JDK Future的API,定义了自身的Future系列类型,实现异步操作结果的获取和监控. 其中,最为重要的是ChannelFuture . 代码如下: public interface ChannelFuture extends Future<Voi

Java多线程之Callable接口与Runnable的实现以及选择

通过实现Runnable接口的实现 package Thread; import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors; public class RunnableThreadDemo { private static int POOL_NUM = 30; // 线程池数量 public static void main(String[] args) throws Interrupte

Java多线程之Callable接口的实现

import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /*  * 一.创建执行线程的方式三:实现 Callable 接口. 相较于实现 Runnable 接口的方式,方法可以有返回值,并且可以抛出异常.  *  * 二.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运