java多线程之FutureTask、Future、CompletableFuture
发布人:shili8
发布时间:2025-01-23 20:45
阅读次数:0
**Java 多线程之 FutureTask、Future 和 CompletableFuture**
在 Java 中,多线程编程是非常重要的概念。它可以帮助我们提高程序的并发性和性能。在本文中,我们将讨论三个相关的类:`FutureTask`、`Future` 和 `CompletableFuture`。
###1. FutureTask`FutureTask` 是一个实现了 `Runnable` 接口的类,它代表一个异步任务。它可以被提交到线程池中执行,并且可以等待任务完成后获取结果。
#### 构造方法:
javapublic FutureTask(Callablecallable) { if (callable == null) throw new NullPointerException(); this.callable = callable; }
#### 方法:
* `run()`:执行任务,返回结果。
* `get()`:等待任务完成后获取结果。
####例子:
javaimport java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class FutureTaskExample { public static void main(String[] args) throws ExecutionException, InterruptedException { // 创建一个FutureTask对象,传入Callable接口的实现类 Callablecallable = new Callable () { @Override public String call() throws Exception { System.out.println("任务正在执行..."); Thread.sleep(2000); return "任务完成"; } }; FutureTask futureTask = new FutureTask<>(callable); // 提交到线程池中执行 Thread thread = new Thread(futureTask); thread.start(); // 等待任务完成后获取结果 String result = futureTask.get(); System.out.println("结果:" + result); } }
###2. Future`Future` 是一个接口,它代表一个异步计算的结果。它可以被用于等待任务完成后获取结果。
#### 方法:
* `get()`:等待任务完成后获取结果。
* `isDone()`:判断任务是否已经完成。
* `isCancelled()`:判断任务是否已经取消。
####例子:
javaimport java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; public class FutureExample { public static void main(String[] args) throws ExecutionException, InterruptedException { // 创建一个Future对象,传入Callable接口的实现类 Callablecallable = new Callable () { @Override public String call() throws Exception { System.out.println("任务正在执行..."); Thread.sleep(2000); return "任务完成"; } }; Future future = java.util.concurrent.Executors.newSingleThreadExecutor().submit(callable); // 等待任务完成后获取结果 String result = future.get(); System.out.println("结果:" + result); } }
###3. CompletableFuture`CompletableFuture` 是一个类,它代表一个异步计算的结果。它可以被用于等待任务完成后获取结果,并且提供了更多的功能。
#### 构造方法:
javapublic static CompletableFuture supplyAsync(Supplier supplier) { return supplyAsync(supplier, executor); }
#### 方法:
* `get()`:等待任务完成后获取结果。
* `thenApply()`:指定一个函数来处理结果。
* `thenAccept()`:指定一个函数来处理结果。
* `thenCombine()`:指定两个函数来处理结果。
* `exceptionally()`:指定一个函数来处理异常。
####例子:
javaimport java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; public class CompletableFutureExample { public static void main(String[] args) throws ExecutionException, InterruptedException { // 创建一个CompletableFuture对象,传入Supplier接口的实现类 Suppliersupplier = new Supplier () { @Override public String get() { System.out.println("任务正在执行..."); Thread.sleep(2000); return "任务完成"; } }; CompletableFuture completableFuture = CompletableFuture.supplyAsync(supplier); // 等待任务完成后获取结果 String result = completableFuture.get(); System.out.println("结果:" + result); } }
在本文中,我们讨论了 `FutureTask`、`Future` 和 `CompletableFuture` 这三个相关的类。它们都代表一个异步计算的结果,可以被用于等待任务完成后获取结果,并且提供了更多的功能。通过使用这些类,开发者可以更容易地编写并发性高的程序,从而提高程序的性能和可维护性。