Future的定义
Future 是 Java 多线程编程中的一个接口,用于表示一个尚未完成的异步计算任务。
Future 允许你提交一个任务给一个线程池,或执行器(Executor),然后在稍后的某个时间获取任务的结果。
Future的作用
Future 的主要作用是允许在多线程和异步编程环境中执行任务并获取其结果,而不必阻塞主线程等待任务的完成。
它具有以下几个主要作用:
1.异步任务提交
Future 允许您提交一个任务给一个线程池或执行器(Executor),而不必等待任务的完成。
这使得主线程可以继续执行其他操作,而不必被任务的执行所阻塞,也就达到了异步任务的目的。
2.跟踪任务状态
通过 Future可以查询任务的状态,包括:是否已经完成、是否被取消等。
3.获取任务结果
通过 get() 方法,可以获取任务的结果,如果任务已经完成,结果将立即返回。
如果任务尚未完成,get() 方法将阻塞当前线程,等待任务完成后再返回结果。
4.限制并发
可以用于限制同时运行的任务数量,以控制并发度,确保不会创建过多的线程,避免资源耗尽和性能下降。
Future的模式
Future 的模式是通过异步提交任务给线程池或执行器,然后在后台线程中执行任务。
Future模式的流程,如下图所示:
主要会包含如下步骤:
1.任务提交
创建一个任务,通常是实现 Callable
或 Runnable
接口的类,表示要执行的操作。
将任务提交给一个线程池(Executor
),使用 ExecutorService
的 submit
方法。这一步是异步的,不会阻塞主线程。
2.获取Future对象
submit
方法返回一个 Future
对象,该对象代表了任务的未完成状态,以便稍后查询任务的状态和获取结果。
主线程可以继续执行其他操作,而不必等待任务完成。
3.查询任务状态
在需要的时候,主线程可以使用 isDone()
方法查询任务是否已经完成。如果任务已完成,可以立即获取结果。
如果任务尚未完成,可以选择等待或执行其他操作。
4.获取结果
如果任务已经完成,主线程可以使用 get()
方法获取任务的结果。这个方法是阻塞的,会等待任务完成后返回结果。
Future的使用
使用 Future
主要包括以下步骤:
- 创建一个
ExecutorService
,它是线程池或执行器,用于提交任务。 - 使用
ExecutorService
的submit
方法提交一个任务,该方法将返回一个Future
对象。 - 使用
Future
对象来跟踪任务的状态和获取结果。您可以使用isDone()
检查任务是否已完成,然后使用get()
获取结果。 - 如果需要,您可以使用
cancel()
尝试取消任务。注意,取消操作可能会中断正在运行的任务。
如下所示:
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 executorService = Executors.newFixedThreadPool(1); Future<Integer> future = executorService.submit(() -> { Thread.sleep(2000); return 42; }); System.out.println("Task submitted"); if (!future.isDone()) { System.out.println("Task is not yet completed. Waiting..."); } try { int result = future.get(); System.out.println("Task completed. Result: " + result); } catch (Exception e) { System.err.println("Task execution failed: " + e.getMessage()); } executorService.shutdown(); } }
Future的应用
Future应用场景:Future 适用于需要执行长时间运行的任务。
比如:网络请求、IO 操作、计算密集型任务等,以确保主线程不被任务的执行所阻塞。