一文搞懂Java异步编程之FutureTask

简介: 一文搞懂Java异步编程之FutureTask

背景

Java异步编程的在实际开发中经常被用到,那么异步任务执行结束如何将结果通知到主线程或者其他任务呢?本文不探讨JUC包下的各类锁实现实现的任务同步或者通知。

狭隘的讲Java创建线程的方式只有一种,就是new Thread实例。Thread本身是Runnable的实现并且它定义了Runnable的field,所以支持自定义实现Runnable接口后,在new实例时构造Thread,最终一个新建的线程都需要通过调用start()执行。

这里有一点值得拿出来讲讲,如果直接执行Thread的run(),那么这时候并不是多线程的,它其实就是在主线程中执行了Runnable中定义的普通run方法。

由于Thread没有返回值,异步处理完的结果获取就有点麻烦。到了JDK1.5的时候,Callable和Future被引入,返回线程执行结果。

二、Future与FutureTask

讲到这里终于点题了,Future是一个接口,可以对Runnable或者Callable的task进行取消、判断是否取消、判断是否完成、获取执行结果;执行结果的获取是阻塞,直到task返回结果或者超时当前线程才会继续往下执行。

Future是一个接口,FutureTask是它的实现类,它的继承关系如下,

public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V>

因此它可以作为Runnable被线程执行。

public static void main(String[] args) throws ExecutionException, InterruptedException {
    FutureTask<String> futureTask = new FutureTask<>(() -> {
        System.out.println(Thread.currentThread().getName()); // Thread-0
        System.out.println("Runnable implements"); // Runnable implements
    }, null);
    new Thread(futureTask).start();
    System.out.println(Thread.currentThread().getName()); // main
    String result = futureTask.get();
    System.out.println(result); // null
}

以上示例代码,输出内容顺序为 main-》Thread-0-》Runnable implements-》null 。最终输出null是因为FutureTask的构造函数中传入的就是null,如果有需要可以传值给异步任务处理,通过自定义Task类实现Runnable接口,把传值作为field给到Task处理。

小结

Future可以很容易的获得异步执行的结果,并且对任务进行一些操控;get等待结果时会阻塞,所以当任务之间有依赖关系的时候,一个任务依赖另一个任务的结果,可以用Future的get来等待依赖的任务完成的结果。

FutureTask是实现类,有Runnable的特性又有Future的特性,内部包的是Callable ,当然也有接受Runnable的构造器,只是会偷偷把Runnable转成Callable来实现能返回结果的方法。

相关文章
|
2月前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
114 3
|
3月前
|
Java
JAVA并发编程系列(13)Future、FutureTask异步小王子
本文详细解析了Future及其相关类FutureTask的工作原理与应用场景。首先介绍了Future的基本概念和接口方法,强调其异步计算特性。接着通过FutureTask实现了一个模拟外卖订单处理的示例,展示了如何并发查询外卖信息并汇总结果。最后深入分析了FutureTask的源码,包括其内部状态转换机制及关键方法的实现原理。通过本文,读者可以全面理解Future在并发编程中的作用及其实现细节。
|
7月前
|
存储 安全 Java
【深度挖掘Java并发编程底层源码】「底层技术原理体系」带你零基础认识和分析学习相关的异步任务提交机制FutureTask的底层原理
【深度挖掘Java并发编程底层源码】「底层技术原理体系」带你零基础认识和分析学习相关的异步任务提交机制FutureTask的底层原理
53 0
|
5月前
|
监控 Java 开发者
Java面试题:解释Java内存模型中的内存顺序规则,Java中的线程组(ThreadGroup)的工作原理,Java中的FutureTask的工作原理
Java面试题:解释Java内存模型中的内存顺序规则,Java中的线程组(ThreadGroup)的工作原理,Java中的FutureTask的工作原理
31 0
|
5月前
|
存储 算法 Java
Java面试题:详细描述Java堆内存的垃圾回收过程,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的FutureTask的工作原理
Java面试题:详细描述Java堆内存的垃圾回收过程,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的FutureTask的工作原理
35 0
|
7月前
|
Java API
java多线程之FutureTask、Future、CompletableFuture
java多线程之FutureTask、Future、CompletableFuture
313 0
|
消息中间件 Java UED
Java并发编程异步操作Future和FutureTask
生活是一个洗礼自己的过程,这个洗礼并不是传统意义上的洗礼,传统意义上的洗礼通常认为这个人的思想得到洗礼,灵魂得到洗礼,十分的清新脱俗,不世故,不圆滑,而现实的洗礼实则是让一个人褪去幼稚,褪去无知,让你变得点头哈腰,圆滑世故,我们都是动物,需要物质满足,更需要欲望填补,所以,变成自己小时候唾骂的对象也是可以理解,不过这是一个选择,你可以进行选择,只是在物欲横流的时代,多数人没有这种选择的权力!
89 0
|
安全 Java 容器
Java 中的FutureTask
Java 中的FutureTask
|
Java
Java Review - 线程池使用FutureTask的小坑
Java Review - 线程池使用FutureTask的小坑
79 0
|
存储 Java
浅谈Java多线程之FutureTask
浅谈Java多线程之FutureTask
246 0