Future和FutureTask的使用

本文详细介绍了Java中FutureTask的使用方法,包括如何将任务提交给后台线程执行,以及如何通过调用get函数获取执行结果。通过示例代码演示了FutureTask在异步编程中的应用,同时对比了首次调用get函数与再次调用get函数的性能差异。

java中提供了futuretask供异步任务使用。可以将一个任务提交给后台线程执行,当需要执行结果的时候调用task.get函数。

如果后台线程还没有执行完,那么task.get将会阻塞,直到后台线程返回。如果后台线程已经执行完,则直接返回结果。

package com.z;

import java.util.Date;
import java.util.concurrent.*;

public class T {

    public static void main(String[] args) {
        fun();
    }

    public static void fun() {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        FutureTask<String> task = new FutureTask<String>(new Callable<String>() {

            @Override
            public String call() throws Exception {
                long b = new Date().getTime();
                System.out.println("call begin " + b);
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < 100000; i++) {
                    sb.append(i).append(",");
                }
                System.out.println("call end " + (new Date().getTime() - b));
                return sb.toString();
            }
        });
        executor.execute(task);
        long begin = new Date().getTime();
        System.out.println("begin" + begin);
        try {
            // System.out.println(task.get());
            task.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("end  " + (new Date().getTime() - begin));
        begin = new Date().getTime();
        System.out.println("begin" + begin);
        try {
            task.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("end  " + (new Date().getTime() - begin));
        executor.shutdown();
    }
}

demo的输出:

begin1409478497265
call begin 1409478497265
call end 30
end  31
begin1409478497296
end  0

从emo的代码可以看出,第一次调用.get函数耗时比较久。而第二次调用耗时为0。

========================================================================

java中有Future和FutureTask这两个类,他们区别是什么呢?

Future是一个接口,代表可以取消的任务,并可以获得任务的执行结果

FutureTask 是基本的实现了Future和runnable接口
           实现runnable接口,说明可以把FutureTask实例传入到Thread中,在一个新的线程中执行。
           实现Future接口,说明可以从FutureTask中通过get取到任务的返回结果,也可以取消任务执行(通过interreput中断)

FutureTask is an implementation of Future. You can explicitly instantiate a FutureTask for a given Runnable or Callable. A FutureTask can be submitted to an Executor for execution as FutureTask implements Runnable. FutureTask can also be executed directly by calling its run method. Once a FutureTask enters the completed state, it stays in that state forever. If the task is completed. FutureTask constructors can accept either Callable or Runnable.





FutureFutureTask存在多方面区别: - **类型不同**:Future是一个接口,无法直接创建对象;而FutureTask是一个类,可以直接创建对象。Future因是接口无法生成实例,所以才有了FutureTask这种具体实现类 [^2][^3]。 - **实现关系不同**:FutureTask实现了RunnableFuture接口,而RunnableFuture接口又继承了Runnable接口Future接口。这使得FutureTask既可以被当做Runnable来执行,也能被当做Future来获取Callable的返回结果 [^1][^3]。 - **使用方式不同**:Future需配合线程池使用.submit()方法,其返回值Future可保存执行结果;而线程池的.execute()方法传入Runnable接口无返回值。FutureTask可将一个Callable或Runnable任务包装成一个Future任务,能让计算的结果存储在一个Future对象中,以便后续查询获取结果 [^1][^2]。 ### 代码示例 ```java import java.util.concurrent.*; public class FutureAndFutureTaskExample { public static void main(String[] args) throws ExecutionException, InterruptedException { // 创建线程池 ExecutorService executor = Executors.newSingleThreadExecutor(); // 使用 Future Callable<String> callableTask = () -> { Thread.sleep(2000); return "Result from Callable"; }; Future<String> future = executor.submit(callableTask); if (future.isDone()) { System.out.println(future.get()); } // 使用 FutureTask FutureTask<String> futureTask = new FutureTask<>(callableTask); executor.execute(futureTask); if (futureTask.isDone()) { System.out.println(futureTask.get()); } executor.shutdown(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值