`
minbing
  • 浏览: 27682 次
  • 性别: 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用法及使用场景介绍,小编觉得挺不错的,这里分享给大家,供大家参考。

    线程超时死掉

    不直接构造Future对象,也可以使用ExecutorService.submit方法来获得Future对象,submit方法即支持以 Callable接口类型,也支持Runnable接口作为参数,具有很大的灵活性。使用示例如FutureTaskAndExcutor中的limit...

    多线程机制

    多线程机制 1 1、 Runnable接口与Thread类 1 2、 两个创建线程方法的比较 3 3、 几个常用的改变线程状态的方法 3 4、 线程的同步机制 8 ...10、 Callable结合FutureTask的多线程使用(免打扰模式) 24

    JUC学习.docx Java

    (2)使用FutureTask(实现Runnable接口)来指定任务,可以通过get方法来获得执行结果,如果当前还获取不到结果就会阻塞,直到结果返回。 (3)调用start方法只是让线程进入就绪状态,是否可以真正运行run()是由任务调度器...

    这就是标题—— JUC.pdf

    使用Lock锁 可重入锁 公平锁 / 非公平锁 Synchronized / Lock 线程通讯 wait()、notify()和notifyAll() 虚假唤醒 Condition 定制化通信 多线程锁 并发下的集合类 List Set Map Callable接口 线程创建的方式 callable...

    Java多线程大量调用百度地图的搜索功能,来做课程作业数据准备

    每条线程的request请求相互独立,写操作也是相互独立,所有线程共同遍历一个数组,当遍历完成时跳出,判断完成原来打算使用futureTask.isDone()去判断,但是后来发现这是非阻塞的,主线程每次会循环判断,很吃资源,...

    LeetCode判断字符串是否循环-java:Java

    task构造器,将futuretask对象传入thread构造器,用futuretask对象的get方法可以接受返回值。 使用excutors的静态方法创建线程.excute(runnable实现类)/.submit(callable实现类),.shutdown() (3)线程的生命周期...

    Java-Concurrency-Programming-Practice:学习 Java 并发编程

    回顾线程编程的基本知识,锁的用法, 学习并发编程的一些高级主题,如Java内存模型、JVM IO/NIO机制等。 在实践中学习: 在实践中学习:并发集合 在实践中学习:如何对并发应用程序进行测试。 实践学习:Java异步...

    积分管理系统java源码-alibaba-Interview-preparation:阿里巴巴实习生面试个人准备

    AsyncTask,内部使用FutureTask实现,通过Handler将结果转发到主线程,默认的Executor是共用的,如果同时执行多个AsyncTask,就可能需要排队,但是可以手动指定Executor解决这个问题,直接new匿名内部类会保存外部类的引用,...

    Java并发编程实战

    5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6 构建高效且可伸缩的结果缓存 第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1...

    Java 并发编程实战

    5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6 构建高效且可伸缩的结果缓存 第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1...

    Java并发编程(学习笔记).xmind

    (1)用作异步任务使用,且可以使用get方法获取任务的结果 (2)用于表示一些时间较长的计算 状态 等待运行 正在运行 运行完成 使用Callable对象实例化FutureTask类 ...

Global site tag (gtag.js) - Google Analytics