Future和 FutureTask

Future
Future 是一个接口,它提供了检查计算是否完成、等待计算完成以及检索计算结果的方法。它通常与 ExecutorService 一起使用,以异步方式执行任务。Future 允许你启动一个可能耗时的计算,而不必等待它完成就能继续执行其他任务。然后,你可以使用 Future 对象来查询计算是否完成,等待计算完成,并检索计算的结果。

主要的方法包括:

boolean isDone():如果任务完成,则返回 true。
boolean isCancelled():如果任务被取消,则返回 true。
V get():等待任务完成,然后获取其结果。
V get(long timeout, TimeUnit unit):等待任务在给定的时间范围内完成,并获取其结果。
boolean cancel(boolean mayInterruptIfRunning):尝试取消任务的执行。

 

使用示例:

Future+ExecutorService

public class FutureTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<String> future = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return "测试Future获取异步结果";
}
});
System.out.println(future.get());
executorService.shutdown();
}

}
 

 


 FutureTask接口是RunnableFuture接口的一个重要的实现类,它实现了RunnableFuture接口、Future接口和Runnable接口的所有方法。

FutureTask 是 Future 接口的一个实现类,它实现了 Runnable 和 Future 接口。它可以将一个 Callable(可以返回结果的 Runnable)或 Runnable 任务包装成一个 Future 任务。FutureTask 主要用于异步计算,并且它可以让你将计算的结果存储在一个 Future 对象中,以便后续可以查询和获取这个结果。

FutureTask 提供了对启动和取消异步计算的支持,以及查询计算是否完成和检索计算结果的方法。此外,FutureTask 还可以作为一个 Runnable 对象被提交给 Executor 执行,这意呀着你可以将 FutureTask 提交给 ExecutorService 来异步执行。

主要区别
实现与接口:Future 是一个接口,而 FutureTask 是 Future 接口的一个具体实现。
功能:Future 主要定义了异步计算结果的获取方法,而 FutureTask 除了这些功能外,还实现了 Runnable 接口,因此可以直接提交给 Executor 执行。
使用场景:当你只需要一个 Future 功能的引用时(比如,你已经有了一个 Future 类型的变量,但你不想或不需要知道具体的实现),你会使用 Future。而当你需要提交一个可返回结果的异步任务给 Executor 执行时,你会使用 FutureTask。

 

使用示例:

1.FutureTask+Thread

public class FutureTaskTest1 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
return "测试FutureTask获取异步结果==>线程";
}
});
new Thread(futureTask).start();
System.out.println(futureTask.get());
}
}
2.FutureTask + ExecutorService

public class FutureTaskTest2 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
return "测试FutureTask获取异步结果==>线程池";
}
});
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(futureTask);
System.out.println(futureTask.get());
}
}

 


 

posted @ 2025-03-26 17:33  KLAPT  阅读(144)  评论(0)    收藏  举报