学习Java中的Future类
Future
接口在Java 5中引入,作为java.util.concurrent
包的一部分。它代表一个异步计算的结果,当计算完成时可以通过Future
对象获取结果。Future
对象提供了一些方法来检查任务是否完成、等待任务完成并获取任务结果、取消任务等。
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类的示例
下面是一个简单的示例,展示了如何使用Future
类来执行异步任务并获取结果。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class FutureExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<Integer> task = () -> {
Thread.sleep(2000);
return 123;
};
Future<Integer> future = executor.submit(task);
try {
// 在任务完成之前可以做其他事情
System.out.println("Task is submitted");
// 检查任务是否完成
if (future.isDone()) {
System.out.println("Task completed");
} else {
System.out.println("Task is still running");
}
// 获取任务结果
Integer result = future.get();
System.out.println("Task result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}
}
}
在这个示例中,我们创建了一个ExecutorService
来执行一个返回整数的任务。任务通过Callable
接口定义,并提交给ExecutorService
。Future
对象用来表示任务的结果,我们可以通过调用future.get()
来获取结果。
处理任务超时
Future
接口提供了一个带超时参数的get
方法,如果任务在指定时间内没有完成,将抛出TimeoutException
。这是处理长时间运行任务的一种有效方法。
try {
Integer result = future.get(1, TimeUnit.SECONDS);
System.out.println("Task result: " + result);
} catch (TimeoutException e) {
System.out.println("Task timed out");
}
取消任务
Future
接口的cancel
方法可以用来取消任务。调用cancel
方法后,任务将无法再被执行或完成。
boolean cancelled = future.cancel(true);
if (cancelled) {
System.out.println("Task was cancelled");
} else {
System.out.println("Failed to cancel task");
}
使用CompletableFuture进行更复杂的异步编程
虽然Future
接口提供了一些基本的异步编程功能,但它的局限性也很明显,例如无法组合多个Future
,不能处理完成后的回调等。为了解决这些问题,Java 8引入了CompletableFuture
,它提供了更强大和灵活的异步编程能力。
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 123;
}).thenAccept(result -> {
System.out.println("Task result: " + result);
}).join(); // 等待所有异步任务完成
}
}
在这个示例中,CompletableFuture.supplyAsync
用于异步执行一个任务,并在任务完成后通过thenAccept
处理结果。join
方法等待所有异步任务完成。
有关更多CompletableFuture
的内容请看这篇文章:学习理解 CompletableFuture: https://blog.csdn.net/kaka_buka/article/details/139663516
参考链接
- Java Future Documentation
- Java CompletableFuture Documentation
- Oracle Java Tutorials: Concurrency
- Java ExecutorService Documentation