美文网首页
了解异步任务——走近Future模式

了解异步任务——走近Future模式

作者: 改大人alden | 来源:发表于2022-01-22 10:56 被阅读0次

一、定义
1.1 什么是异步任务
说到异步任务,我们第一时间想到的是多线程,我们常说的多线程问题,一般是指线程并发问题和数据同步问题。而异步任务属于多线程编程的一个环节:主线程在继续当前任务的同时,创建一个或多个新的非阻塞线程去执行其他任务。

1.2 异步任务解决了什么问题
当主流程外需要执行1个或多个复杂计算,为了保障执行效率,可以使用异步任务。异步任务的主要作用是最大程度地使用服务器的性能,提升程序的响应速度。

1.3 业务场景
无需获取响应结果的简单异步 如:消息通知

需要响应结果的异步 如:商品信息查询

二、Future模式
2.1 Future模式的概念
我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。

2.2 Future模式的变种
Callback:任务执行结束后主动触发其他任务流程图

Promise:支持对任务结果的修改

三、Java实现异步任务的方式
3.1 怎样实现异步任务?
JDK1.5 之前——Runnable接口
在jdk1.5之前,Java仅支持通过Runnable接口创建线程。Runnable接口只有一个返回类型为void的run方法,不支持获取返回值。

public interface Runnable {
    public abstract void run();
}

我们可以通过创建Thread对象来实现异步任务:

class Thread implements Runnable {
    private Runnable target;
    public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }

    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
}
    @Test
    public void testNewThread() {
       Thread t1 = new Thread(new Runnable() {
           @Override
           public void run() {
               System.out.println("hello new thread");
           }
       });
       t1.start();
    }

存在的问题:

  • Runnable接口没有返回值

  • Runnable接口不支持抛出异常

JDK1.5 ——FutureTask
为了解决获取异步任务结果的问题,JDK新增了Callable接口

public interface Callable<V> {
    V call() throws Exception;
}

怎样使用Callable接口?
JDK1.5还新增了Future接口和ExecutorService,Callable接口需要与Future和ExecutorService结合使用

public interface Future<V> {
    V get() throws InterruptedException, ExecutionException;

    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}
    <T> Future<T> submit(Callable<T> task);
}

查看ThreadPoolExecutor的源码会发现,submit方法返回的Future对象实际上是一个FutureTask。

Future接口的实现——FutureTask


image.png

FutureTask实现了Future接口,为Java使用者提供了Future模式的基本功能。怎样使用FutureTask?

  • FutureTask继承了Runnable接口,可结合Thread使用,也可以通过Executor的execute方法被执行
  • FutureTask也继承了Future接口,可以作为ExecutorService的submit返回结果,作为获取异步任务响应的凭证

JDK1.8 ——CompletableFuture
JDK1.8 新增了CompletableFuture,它是Future接口的另一个实现类。为什么JDK新增了CompletableFuture?

它有三大功能是Future以及FutureTask所没有的:

  • 异步任务回调(callback模式)
  • 异步任务批处理
  • 主动完成任务并设置返回值(promise模式)

3.2 FutureTask VS CompletableFuture

相关文章

  • 了解异步任务——走近Future模式

    一、定义1.1 什么是异步任务说到异步任务,我们第一时间想到的是多线程,我们常说的多线程问题,一般是指线程并发问题...

  • flutter之---Future的正确用法

    在flutter中经常会用到异步任务,dart中异步任务异步处理是用Future来处理,那么如何实现用Future...

  • flutter Future

    在flutter中经常会用到异步任务,dart中异步任务异步处理是用Future来处理,那么如何实现用Future...

  • Future设计模式

    1、Future前言 Future设计模式从本质上是用来解决的根本的问题在于可以让一个任务在异步执行,而任务执行完...

  • Java8 CompletableFuture指北

    一、JAVA 异步处理的演变 1.1 Future JDK 5引入了Future模式。Future模式是多线程设计...

  • Flutter -- 9.异步编程

    一.使用Future异步编程 Dart中使用Future完成异步操作 1.基本的异步代码示例 任务代码块,执行的异...

  • AbstractExecutorService类

    Future   Future表示一个异步任务的执行结果。 RunnableFuture Callable Fut...

  • 异步编程

    同步、异步、阻塞、非阻塞 Future JDK 5引入了Future模式。重点实现的是并发处理,异步阻塞 Futu...

  • Java中的Future模式

    Future模式 核心思想是异步调用,在java中内置了对Future模式的实现,主要就是Future接口、Cal...

  • 自定义FutureTask实现

    FutureTask FutureTask是Future的实现,用来异步任务的获取结果,可以启动和取消异步任务,查...

网友评论

      本文标题:了解异步任务——走近Future模式

      本文链接:https://www.haomeiwen.com/subject/tivloktx.html