Future接口
public interface Future<V> {
//尝试取消此次任务 mayInterruptIfRunning - true如果执行该任务的线程应该被中断; 否则,正在进行的任务被允许完成
boolean cancel(boolean mayInterruptIfRunning);
//如果此任务在正常完成之前被取消,则返回 true 。
boolean isCancelled();
//返回true如果任务已完成。 完成可能是由于正常终止,异常或取消 - 在所有这些情况下,此方法将返回true 。
boolean isDone();
//等待计算完成然后返回结果
V get() throws InterruptedException, ExecutionException;
//在指定的时间之内进行等待,超时不等待
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
FutureTask
使用方法
因为FutureTask实际上是实现的RunnableFuture
接口,而RunnableFuture
接口其实是继承自Runnable
和Future
,所以其同时具有他们共同的特点,可以直接交给线程池进行执行。
ExecutorService executorService = Executors.newSingleThreadExecutor();
FutureTask<Integer> integerFutureTask = new FutureTask<Integer>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int sum=0;
for (int i = 0; i < 10; i++) {
sum+=i;
}
return sum;
}
});
executorService.execute(integerFutureTask);
//获取Future的第二种方式
Future<Integer> submit = executorService.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int sum=0;
for (int i = 0; i < 10; i++) {
sum+=i;
}
return sum;
}
});
System.out.println("在这里随便做什么事");
System.out.println(integerFutureTask.get());
//效果和上面相同只不过设定的最长等待时间为2s TimeUnit用来设置时间单位
System.out.println(integerFutureTask.get(2,TimeUnit.SECONDS));
Future其实就相当于你把一件工作交给某个人来完成,而你最后只需要干你自己的事,到时间了找他要已经做好的成品就好了。
就如同领导发号施令:给你一个DeadLine,让你干某件事,然后你给领导在规定时间干完,等领导来要结果。