6.AsyncTask中的FutureTask和Callable

来源:互联网 发布:云豹直播app源码 编辑:程序博客网 时间:2024/06/06 15:03

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()方法可以停止任务的执行。有兴趣的同学可以试一下。

原创粉丝点击