设为首页 加入收藏

TOP

Java中Future与FutureTask使用与分析(一)
2018-10-23 00:06:02 】 浏览:436
Tags:Java Future FutureTask 使用 分析

Future与FutureTask都是用于获取线程执行的返回结果。下面我们就对两者之间的关系与使用进行一个大致的介绍与分析


一、Future与FutureTask介绍:


Future位于java.util.concurrent包下,它是一个接口


public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}


Future接口中声明了5个方法,下面介绍一下每个方法的作用:


cancel方法用来取消任务,取消成功则返回true,取消失败则返回false。参数mayInterruptIfRunning设置为false,表示不允许在线程运行时中断,设置为true则表示允许。具体可分为以下三种情况:


        1、如果任务已经完成,则无论mayInterruptIfRunning为true还是false,都返回false,这是因为你要取消的任务已经完成,则认为取消任务失败;


        2、如果任务正在执行,则无论mayInterruptIfRunning为true还是false,都返回true。只不过mayInterruptIfRunning为true时线程会被中断,false时线程不会被中断会执行完。


        3、如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,都返回true。


isCancelled方法用于判断任务是否被取消成功,cancel方法成功则返回 true,反之则为false。


isDone用于判断任务是否完成,  如果任务完成则返回true。任务完成包括正常结束、任务被取消、任务发生异常,都返回true


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


get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,抛出 java.util.concurrent.TimeoutException 异常


FutureTask 实现了RunnableFuture接口,而RunnableFuture则继承了Future<V>与Runnable接口,所以 FutureTask不仅实现了 Future<V>接口的所有方法,还具有自己的run方法,我们可以看下它的类图



二、Future与FutureTask使用与分析


1、使用Future时,我们需要实现Callable接口,并通过ExecutorService接口的submit方法获取返回的Future对象,


2、使用FutureTask时,根据FutureTask的构造函数可以看到FutureTask既可以接收Callable的实现类,也可以接收Runnable的实现类。当你传入的是Callable的实现类时,可以获取线程执行的结果;传入Runnable的实现类时,由于Runnable的实现没有返回值,需要传入一个你设置的线程完成标识,也就是result,然后当线程结束时会把你传入的result原值返回给你,FutureTask的构造函数具体如下:


    public class FutureTask<V> implements RunnableFuture<V>{
     
    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);//runnable转化为callable
        this.state = NEW;      // ensure visibility of callable
    }


 接下来我们看下Future与FutureTask具体的使用代码:


        // 执行任务 实现Runnable
        FutureTaskJobRunnable taskRun = new FutureTaskJobRunnable();
        // 执行任务 实现Callable
        FutureTaskJobCallable taskCall = new FutureTaskJobCallable();
        String val = "ok";
        // 线程运行成功后把,返回你传入的val值
        FutureTask<String> futureTaskRun = new FutureTask<String>(taskRun, val);
        // 线程运行,返回线程执行的结果
        FutureTask<String> futureTaskCall = new FutureTask<String>(taskCall);
       
        //声明线程池
        Execut

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言递归解决年龄问题 下一篇C#中结构体定义并转换字节数组

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目