`
minbing
  • 浏览: 27977 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

FutureTask 用法

    博客分类:
  • java
 
阅读更多

FutureTask应用场景:
如果不想分支线程阻塞主线程,又想取得分支线程的执行结果,就用FutureTask
 

 

    FutureTask简介:

FutureTask是一种可以取消的异步的计算任务。它的计算是通过Callable实现的,它等价于可以携带结果的Runnable,并且有三个状态:等待、运行和完成。完成包括所有计算以任意的方式结束,包括正常结束、取消和异常。

Future有个get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。

Executor框架利用FutureTask来完成异步任务,并可以用来进行任何潜在的耗时的计算。一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。

FutureTask有下面几个重要的方法:

1.get() 阻塞一直等待执行完成拿到结果

2.get(int timeout, TimeUnit timeUnit) 阻塞一直等待执行完成拿到结果,如果在超时时间内,没有拿到抛出异常

3.isCancelled() 是否被取消

4.isDone() 是否已经完成

5.cancel(boolean mayInterruptIfRunning) 试图取消正在执行的任务
 

 

下面是网上找的FutureTask的示例:

 

 

public class CountNum implements Callable {

    private Integer sum;

    public CountNum(Integer sum) {
        this.sum = sum;
    }

    public Object call() throws Exception {
        for (int i = 0; i < 100; i++) {
            sum = sum + i;
        }
        // 休眠5秒钟,观察主线程行为,预期的结果是主线程会继续执行,到要取得FutureTask的结果是等待直至完成。
        Thread.sleep(3000);
        System.out.println("futureTask 执行完成" + System.currentTimeMillis());
        return sum;
    }

}

 

 

public class FutureTaskTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        CountNum cn = new CountNum(0);
        // FutureTask<Integer> 这里的表示返回的是Integer
        FutureTask<Integer> ft = new FutureTask<Integer>(cn);
        Thread td = new Thread(ft);
        System.out.println("futureTask开始执行计算:" + System.currentTimeMillis());
        td.start();
        System.out.println("main 主线程可以做些其他事情:" + System.currentTimeMillis());
        try {
            // futureTask的get方法会阻塞,知道可以取得结果为止
            Integer result = ft.get();
            System.out.println("计算的结果是:" + result);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("取得分支线程执行的结果后,主线程可以继续处理其他事项");
    }

}
分享到:
评论

相关推荐

    futuretask用法及使用场景介绍

    FutureTask用法及使用场景介绍 FutureTask是一种异步获取执行结果或取消执行任务的机制,它可以用来处理耗时的计算任务,使主线程不需要等待计算结果,而是继续执行其他任务。下面将详细介绍FutureTask的用法和使用...

    FutureTask学习

    下面将详细介绍`FutureTask`的主要特性和用法: 1. **构造方法**: - `FutureTask(Callable&lt;V&gt; callable)`:用给定的`Callable`实例创建一个新的`FutureTask`。 - `FutureTask(Runnable runnable, V result)`:用...

    spring线程池ThreadPoolExecutor配置以及FutureTask的使用

    在本篇文章中,我们将深入探讨`ThreadPoolTaskExecutor`的配置及其使用,并结合`FutureTask`来讨论异步任务处理。 首先,让我们了解`ThreadPoolTaskExecutor`的基本配置。在Spring中,我们通常通过在配置文件或Java...

    Java FutureTask类使用案例解析

    Java FutureTask类使用案例解析 Java FutureTask类是一种异步计算的工具,用于执行长时间的任务并获取结果。它实现了Runnable和Future接口,既可以作为一个Runnable对象提交给Executor执行,也可以作为一个Future...

    Java中的Runnable,Callable,Future,FutureTask的比较

    在实际开发中,ExecutorService(如ThreadPoolExecutor)经常与Future和FutureTask一起使用,因为ExecutorService可以提交Runnable或Callable任务,并返回Future,从而实现对任务的异步处理和结果获取。例如: ```...

    揭密FutureTask.docx

    《揭密FutureTask:Java异步编程的核心工具》 在Java并发编程中,FutureTask扮演着至关重要的角色,它是实现异步计算的关键组件。...通过理解其内部原理和使用方法,开发者能够更高效地编写并发程序,提升系统性能。

    FutureTask底层实现分析,有了FutureTask主线程要想获得工作线程(异步计算线程)的结果变得比较简单

    当使用 FutureTask.get() 方法时,将返回 Callable 接口的返回对象。 FutureTask 的核心方法是 run() 方法,该方法执行 Callable 接口的任务逻辑,并将结果返回。在 run() 方法中,firstly,它会检查状态是否为 NEW...

    Java线程池FutureTask实现原理详解

    2、 线程池使用一个线程,执行这个FutureTask任务,线程执行任务过程比较简单,最终会调用Callable.call()或者是Runnable.run()方法,然后得到一个结果,把结果存储在FutureTask实例的outcome属性中,同时把状态修改...

    Java中Future、FutureTask原理以及与线程池的搭配使用

    当`FutureTask`被提交给`ExecutorService`时,`ExecutorService`会调用`FutureTask`的`run()`方法来执行任务。任务完成后,结果将被存储,可以通过`get()`方法获取。 `ExecutorService`通常通过`Executors`工厂类...

    比较java中Future与FutureTask之间的关系

    因此,FutureTask不仅实现了Future接口的所有方法,还具有自己的run方法。 三、Future与FutureTask的关系 Future和FutureTask都是用于获取线程执行的返回结果,但是它们之间存在一些差异: 1. Future是接口,...

    简谈java并发FutureTask的实现

    在这个简谈中,我们将深入探讨`FutureTask`的实现原理和使用方式。 首先,`FutureTask`实现了`Runnable`接口,这意味着它可以直接被`Executor`服务执行。同时,它也实现了`Future`接口,提供了检查任务是否完成、...

    Java 多线程与并发(17-26)-JUC线程池- FutureTask详解.pdf

    ### Java多线程与并发(17-26)-JUC线程池-FutureTask详解 #### 一、概述 本文将围绕Java多线程与并发中的重要概念——`...理解`FutureTask`的工作原理及其使用方法,对于提高程序的并发性能和响应能力具有重要意义。

    Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable

    `Future`、`FutureTask`、`Callable`和`Runnable`是Java并发编程中的核心接口和类,它们在Android开发中同样有着广泛的应用。下面将详细介绍这些概念以及它们如何协同工作。 1. `Runnable`: 这是Java中最基础的多...

    tiny-asyncload:动态代理+延迟加载+futureTask的一种应用思路

    FutureTask可以作为一个可取消的任务提交给Executor服务执行,并且提供了检查任务状态(如是否完成、获取结果等)的方法。当我们想要在主线程中等待异步任务完成并获取其结果时,FutureTask就显得非常有用。它可以...

    java多线程编程同步器Future和FutureTask解析及代码示例

    在Java并发编程中,通常我们会使用`ExecutorService`来提交任务,而`Future`和`FutureTask`就是与这些任务交互的关键。 首先,`Future`是一个接口,它提供了一种机制来检查异步计算是否完成,以及在计算完成后获取...

    java多线程返回值使用示例(callable与futuretask)

    下面是一个使用`Callable`和`FutureTask`的简单示例: ```java import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import ...

    Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解

    接下来,我们将深入探讨这些组件的特性和使用方法。 首先,CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达一个特定的屏障点。CyclicBarrier的名字来源于它的可重用性,当所有线程都...

    【Java】Callable创建线程用到的适配器模式(csdn)————程序.pdf

    本文将详细解释Callable接口的使用、适配器模式在创建线程中的应用,以及FutureTask在其中的角色。 首先,Callable接口与Runnable接口类似,都是用于创建新线程的接口。但是,Runnable接口的run()方法无返回值,而...

    多线程执行完后主程序再执行(包括需要子线程返回结果)

    在实际应用中,`FutureTask`经常与`ExecutorService`结合使用,形成一个异步执行模型,确保主程序在所有子线程执行完毕后再继续执行,同时能够获取到每个子线程的执行结果。这样的设计提高了程序的响应性和并发能力...

    Java使用Callable和Future创建线程操作示例

    2. 使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。 3. 使用FutureTask对象作为Thread对象的target创建并启动新线程。 4. 调用FutureTask对象的get()方法来获得...

Global site tag (gtag.js) - Google Analytics