一、学习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) {}
网友评论