FutureTask使用

JUC 专栏收录该内容
14 篇文章 0 订阅

FutureTask使用

FutureTask介绍

FutureTask 表示一个异步运算的任务。FutureTask 里面可以传入一个 Callable 的具体实现类,可以对这个异步运算的任务的结果进行等待获取、判断是否已经完成、取消任务等操作。

FutureTask实现接口

FutureTask实现了RunnableFuture接口,而接口RunnableFuture继承了Runnable, Future。

public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V> 

FutureTask构造函数

FutureTask有两个构造函数,分别可以接受Callable和Runnable的实现类。

public FutureTask(Callable<V> callable) {
    if (callable == null)
    throw new NullPointerException();
    this.callable = callable;
    this.state = NEW;       // ensure visibility of callable
}


public FutureTask(Runnable runnable, V result) {
    this.callable = Executors.callable(runnable, result);
    this.state = NEW;       // ensure visibility of callable
}

FutureTask的使用

因为FutureTask实现了RunnableFuture接口,而接口RunnableFuture继承了Runnable。所以可以使用Thread来start(),也可以使用线程池executor.execute()和executorService.submit()

又因为接口RunnableFuture继承了 Future接口,我们可以通过FutureTask来获取线程执行的结果。

public static void main(String[] args) {
        //创建一个FutureTask
        FutureTask futureTask = new FutureTask(new Callable() {
            @Override
            public Object call() throws Exception {
                System.out.println("执行call,并返回数值");
                return 5;
            }
        });
		
    	//用线程池
    	//Executor executor = Executors.newCachedThreadPool();
    	//ExecutorService pool = Executors.newFixedThreadPool(5);
    	//executor.execute(futureTask);
        //pool.submit(futureTask);
    
        //创建Thread
        Thread thread = new Thread(futureTask);
        //启动线程
        thread.start();

        try {
            Integer result = (Integer) futureTask.get();
            System.out.println("获得的线程执行结果:"+result);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

结果

执行call,并返回数值
获得的线程执行结果:5
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值