FutureTask

作者: 小超人爱小土豆 | 来源:发表于2018-08-10 09:37 被阅读43次

    一、学习FutureTask的时候,要知道,为什么引入这个概念。

            我们在创建线程的时候,一般都是继承thread类或者实现runnable接口这两种。但是他们都有一个共同的问题就是没法返回线程执行之后的结果(当然你也可以通过共享变量或者使用线程通信的方式来达到效果)。java5之后提供了callable和Future接口,通过他们就可以在任务执行结束后返回执行结果。

    二、本文主要就是浅析一下这个三个类Callable、Future、FutureTask。

       (一)Callable:

       Callable 的使用要配合ExecuteServer。

        ExecuteServer的submit方法是一个多态的方法。

        (1)Futuresubmit(Callabletask);

        (2)Future submit(Runnable task, T result);

        (3)Future submit(Runnable task);

        Callable接口:

        public interface Callable<V> {

        V call() throws Exception;//这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。

        }

        (二)Future:

        就是对具体的callable与runnable任务的执行结果进行取消,查询是否完成,通过使用get方法获取线程最终的执行结果,get方法会阻塞直到任务返回结果。

        重点:(敲黑板)

        Future重心是:获取线程执行结果、能够中断任务、判断任务是否执行结束

        Future位于concurrent包下,他是一个接口

        具体定义了如下五个方法:

        public interface Future {

        ① boolean cancel(boolean mayInterruptIfRunning);

       ②  boolean isCancelled();

        ③ boolean isDone();

        ④ V get() throws InterruptedException, ExecutionException;

       ⑤  V get(long timeout, TimeUnit unit)

            throws InterruptedException, ExecutionException, TimeoutException;

    }

        cancel:用来取消任务。

        如果取消任务成功----------------ture、如果取消任务失败-------------false。

        参数mayInterruptIfRunning:标示是否取消正在执行但没有执行完毕的任务。如果设置true,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为true还是false,此方法肯定返回false,即如果取消已经完成的任务会返回false;如果任务正在执行,若mayInterruptIfRunning设置为true,则返回true,若mayInterruptIfRunning设置为false,则返回false;如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,肯定返回true。

        isCancelled

        方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。

        isDone

        方法表示任务是否已经完成,若任务完成,则返回true;

        get()

        方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;

        get(long timeout, TimeUnit unit)

        用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。

        (三)FutureTask:

        futuretask是实现了runnablefuture接口,而runnablefuture接口是继承了runnable和future两个接口。而futureTask又实现了runnable接口,所以futuretask即可以被线程执行,又可以作为future得到callable的返回值。

        FutureTask提供了2个构造器:public     FutureTask(Callable callable) {}

        public FutureTask(Runnable runnable, V result) {}

    相关文章

      网友评论

        本文标题:FutureTask

        本文链接:https://www.haomeiwen.com/subject/bjoqbftx.html