首页 > 其他分享 >Future和FutureTask

Future和FutureTask

时间:2024-02-07 17:06:03浏览次数:36  
标签:get 任务 Future 线程 FutureTask public

(Future和FutureTask)

Future类

FutureTask叫未来任务,可以将一个复杂的任务剔除出去交给另外一个线程来完成 在这里插入图片描述

Future主要方法

get()

get方法的行为取决于Callable任务的状态,只有以下5种情况:

  1. 任务正常完成:get方法会立刻返回结果
  2. 任务尚未完成:任务还没有开始或进行中,get将阻塞并直到任务完成。
  3. 任务执行过程中抛出Exception:get方法会抛出ExecutionException,这里抛出异常,是call()执行 时产生的那个异常
  4. 任务被取消:get方法会抛出CancellationException
  5. 任务超时:get方法有一个重写方法,是传入一个延迟时间的,如果时间到了还没有获得结果,get方法会抛出TimeoutException

get(long timeout,TimeUnit unit)

如果call()在规定时间内完成任务,那么就会正常获取到返回值,而如果在指定时间内没有计算出结果, 则会抛出TimeoutException

cancel()

  • 如果这个任务还没有开始执行,任务会被正常取消,未来也不会被执行,返回true
  • 如果任务已经完成或已经取消,则cancel()方法会执行失败,方法返回false
  • 如果这个任务已经开始,这个取消方法将不会直接取消该任务,而是会根据参数 mayInterruptIfRunningg来做判断。如果是true,就会发出中断信号给这个任务。

isDone()

  • 判断线程是否执行完,执行完并不代表执行成功。

isCancelled()

  • 判断是否被取消

用线程池的submit方法返回Future对象

首先要给线程池提交任务,提交时线程池会立刻返回一个空的Future容器。当线程的任务一旦执行完, 也就是当我们可以获取结果时,线程池会把该结果填入到之前给我们的那个Future中去(而不是创建一 个新的Future),我们此时可以从该Future中获得任务执行的结果。

/**
 * 案例:演示一个Future的使用方法
 */
public class Demo22Future {
    public static void main(String[] args) {

        ExecutorService service = Executors.newFixedThreadPool(10);
        Future<Integer> future = service.submit(new CallableTask());

        try {
            //等待3秒后打印
            System.out.println(future.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        service.shutdown();
    }

    static class CallableTask implements Callable<Integer> {
        @Override
        public Integer call() throws Exception {
            Thread.sleep(3000);
            return new Random().nextInt();
        }
    }
}

用FutureTask来创建Future

用FutureTask来获取Future和任务的结果。FutureTask实现Runnable和Future接口 在这里插入图片描述 把Callable实例当作参数,生成FutureTask的对象,然后把这个对象当作一个Runnable对象,用线程池 去执行这个Runnable对象,最后通过FutureTask获取刚才执行的结果。

/**
 * 案例:演示FutureTask的用法
 */
public class Demo23FutureTask {

    public static void main(String[] args) {
        Demo23FutureTask.Task task = new Demo23FutureTask.Task();
        //FutureTask继承Future和Runnalbe接口
        FutureTask<Integer> integerFutureTask = new FutureTask<>(task);

        //new Thread(integerFutureTask).start();

        ExecutorService service = Executors.newCachedThreadPool();
        service.submit(integerFutureTask);

        try {
            System.out.println("task运行结果:"+integerFutureTask.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
    static class Task implements Callable<Integer> {
        @Override
        public Integer call() throws Exception {
            System.out.println("子线程正在计算");
            Thread.sleep(3000);
            //模拟子线程处理业务逻辑
            int sum = 0;
            for (int i = 0; i < 100; i++) {
                sum += i;
            }
            return sum;
        }
    }
}

标签:get,任务,Future,线程,FutureTask,public
From: https://blog.51cto.com/u_15323027/9638248

相关文章

  • SpringBoot中使用Spring自带线程池ThreadPoolTaskExecutor与Java8CompletableFuture实
    场景关于线程池的使用:Java中ExecutorService线程池的使用(Runnable和Callable多线程实现):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126242904Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例:https://blog.csdn.net/BADAO_......
  • C++中promise和future初认识
    future/promisefuture提供了一个基于数据(future模板类型)的异步概念:对于一个类型T,可以在以后通过get接口获得这个类型T的变量。或者打个不太恰当的比方,当你获得一个future对象时,就获得了一个消费券(consumer):拿着这张券可以兑换(get)一个T类型的结果(如果数据未就绪的话会阻塞等......
  • 深入解析CompletableFuture的功能和用法
    https://zhuanlan.zhihu.com/p/650390185?utm_id=01.CompletableFuture简介1.1概述CompletableFuture是Java8中引入的一个类,它实现了CompletionStage接口,提供了一组丰富的方法来处理异步操作和多个任务的结果。它支持链式操作,可以方便地处理任务的依赖关系和结果转换......
  • 初中英语优秀范文100篇-070A Job I Want to Do in the Future-我未来想做的工作
    PDF格式公众号回复关键字:SHCZFW070记忆树1Everyonehashisdreamjob.SodoI.翻译每个人都有他的理想工作。我也一样。简化记忆工作句子结构主语:Everyone(每个人)谓语:has(有)宾语:hisdreamjob(他的理想工作)SodoI是一个倒装句,表示"Ialsohavemydreamjob",其......
  • Supplier 惰性调用和 Future#get 同步等待调用结合
    ......
  • java Future多个任务的超时时间问题
    问题publicstaticvoidmain(String[]args)throwsInterruptedException,ExecutionException,TimeoutException{ExecutorServiceexecutor=Executors.newSingleThreadExecutor();Future<String>future=executor.submit(()->"......
  • FutureTask源码阅读
    目录简介例子代码分析成员变量方法参考链接本人的源码阅读主要聚焦于类的使用场景,一般只在java层面进行分析,没有深入到一些native方法的实现。并且由于知识储备不完整,很可能出现疏漏甚至是谬误,欢迎指出共同学习本文基于corretto-17.0.9源码,参考本文时请打开相应的源码对照,否则......
  • CompletableFuture如何使用
    CompletableFuture创建异步任务的三种方法:completedFuture-用于构建一个现成的CompletableFuture对象,runAsync-没有返回值,supplyAsync-支持返回值获取CompletableFuture结果的方法有两个:join(),get().二者的区别在于join方法抛出的是RuntimeEx......
  • FutureBuilder
    FutureBuilder是一个可以自动追踪Future的状态并在其状态改变的时候自动重绘的组件。FutureBuilder追踪Future的状态1、定义一个模拟请求数据的异步方法2、模拟数据加载的时候加载一个Indicator,数据加载完毕后显示数据classMyHomePageextendsStatefulWidget{constM......
  • Future异步
    在其他语言,比如java、c++中,同时要执行多个任务可以使用多线程来实现。而在Dart语言中没有线程和进程的概念,它是单线程+事件循环的设计模式,Dart和Flutter中要同时执行多个任务可以使用异步来实现,Flutter中主要使用Future来实现异步操作。 Future返回值 Future是一个泛......