FutureTask是Java中的一个类,它实现了RunnableFuture接口,用于异步执行任务并获取结果。以下是使用FutureTask的基本步骤和示例:
创建FutureTask
创建FutureTask实例需要传入一个实现了Callable
接口的对象或者一个Runnable
对象。Callable
接口允许任务返回一个结果,并且可以抛出异常。
// 使用Callable创建FutureTask
Callable<Integer> callable = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
// 模拟耗时操作
Thread.sleep(2000);
return 42;
}
};
FutureTask<Integer> futureTask = new FutureTask<>(callable);
执行FutureTask
可以通过Thread
直接执行FutureTask
,或者提交给ExecutorService
。
// 通过Thread执行FutureTask
Thread thread = new Thread(futureTask);
thread.start();
// 通过ExecutorService执行FutureTask
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(futureTask);
获取结果
使用get()
方法等待计算完成并获取其结果。如果任务未完成,get()
方法会阻塞。
// 获取任务结果
try {
Integer result = futureTask.get();
System.out.println("任务结果: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
取消任务
可以使用cancel()
方法取消任务的执行。如果任务已经完成、已经取消或者由于其他原因而不能被取消,则cancel()
方法将返回false
。
// 取消任务
boolean cancelled = futureTask.cancel(true);
if (cancelled) {
System.out.println("任务已取消");
} else {
System.out.println("任务无法取消");
}
使用场景
-
异步计算 :FutureTask用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
-
确保任务只执行一次 :在高并发环境下,FutureTask的特性可以确保某些任务只执行一次。
-
资源预加载 :FutureTask可以用于预先加载资源,当需要使用时,通过
get()
方法获取。
注意事项
-
get()
方法只能调用一次,因为一旦调用,任务就会结束,无法再次启动或取消。 -
如果任务被取消,
get()
方法会抛出CancellationException
异常。
以上就是使用FutureTask的基本方法。