6.AsyncTask中的FutureTask和Callable

1.Callable接口

public interface Callable<V> {
    V call() throws Exception;
}

Callable接口只定义了一个函数,从接口的定义当中我们可以看出Callable接口是有返回值的。那么我们如何获取它的返回值呢,这就需要用到java设计好的的一个类FutureTask。

2.Future 接口

Future 接口主要提供了一下几个方法

    //取消线程的执行
    boolean cancel(boolean mayInterruptIfRunning);

   //判断是否停止执行
    boolean isCancelled();

   //判断线程是否执行完成
    boolean isDone();

    //获取返回值
    V get() throws InterruptedException, ExecutionException;

    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;

Future接口主要提供了以上几种方法,而FutureTask是它的唯一实现类。

3.案例

(1)首先实现Callable接口

    //异步任务
    static class Task implements Callable<Integer>{

        //返回异步任务的执行结果
        @Override
        public Integer call() throws Exception {
            int i = 0;
            for (; i < 10; i++) {
                try {
                    System.out.println(Thread.currentThread().getName() + "_"+i);
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            return i;
        }   
    }

(2)将异步任务当做参数传入到FutureTask中

Task work = new Task();
        FutureTask<Integer> future = new FutureTask<Integer>(work){
            //异步任务执行完成,回调
            @Override
            protected void done() {
                try {
                //任务完成调用get()方法就可以得到返回值。
                    System.out.println("done:"+get());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
        };

    //放入线程池中执行。
        ExecutorService executor = Executors.newCachedThreadPool();
        executor.execute(future);

当然我们调用future的cancel()方法可以停止任务的执行。有兴趣的同学可以试一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值