在Java中,Future 是一种用于表示异步计算的机制。它允许你在执行一些长时间运行的任务时,能够在未来某个时刻获取计算结果。这种机制通常与线程池(如 ExecutorService)结合使用,能够帮助你管理和监控异步任务的执行状态。
Future 接口定义了与异步任务相关的一些方法,主要用于处理线程的返回值、任务的状态以及取消任务等功能。
public interface Future<V> { V get() throws InterruptedException, ExecutionException; // 获取任务结果 V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; // 带超时的获取结果 boolean cancel(boolean mayInterruptIfRunning); // 取消任务 boolean isCancelled(); // 判断任务是否被取消 boolean isDone(); // 判断任务是否完成}php352 Bytes© 菜鸟-创作你的创作get()
阻塞方法,用于获取异步任务的结果。如果任务已经完成,它会立即返回结果;如果任务还未完成,它会等待直到任务完成并返回结果。V result = future.get();InterruptedException(当前线程在等待时被中断)和 ExecutionException(任务执行异常)。get(long timeout, TimeUnit unit)
与 get() 方法类似,但是它会等待指定的时间。如果超时,则抛出 TimeoutException。V result = future.get(1, TimeUnit.SECONDS); // 等待 1 秒timeout 是超时的最大时间,unit 是时间单位(秒、毫秒等)。cancel(boolean mayInterruptIfRunning)
取消任务的执行。如果任务已经完成,返回 false,否则尝试取消任务。mayInterruptIfRunning 参数表示是否中断正在执行的任务。boolean cancelled = future.cancel(true); // 中断任务false;如果任务成功取消,则返回 true。isCancelled()
返回任务是否被取消。boolean cancelled = future.isCancelled(); // 判断任务是否被取消isDone()
返回任务是否已经完成,无论任务是成功完成还是异常终止,都会返回 true。boolean done = future.isDone(); // 判断任务是否完成ExecutorService 提供了多种方法来提交异步任务,其中最常用的方法是 submit()。该方法会返回一个 Future对象,可以用它来获取任务的结果、判断任务状态或取消任务。
import java.util.concurrent.*;public class FutureExample { public static void main(String[] args) throws InterruptedException, ExecutionException { // 创建一个线程池 ExecutorService executorService = Executors.newFixedThreadPool(2); // 提交一个任务,返回一个Future对象 Future<Integer> future = executorService.submit(() -> { // 模拟长时间运行的任务 Thread.sleep(2000); return 123; }); // 阻塞直到任务完成并获取结果 Integer result = future.get(); System.out.println("Result: " + result); // 输出 123 executorService.shutdown(); }}php615 Bytes© 菜鸟-创作你的创作有时,你希望获取任务的结果,但又不希望程序一直等待下去。Future.get(long timeout, TimeUnit unit)方法可以设置超时时间,确保不会无限期地阻塞。
import java.util.concurrent.*;public class TimeoutExample { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); // 提交一个耗时任务 Future<Integer> future = executorService.submit(() -> { Thread.sleep(3000); // 模拟长时间任务 return 123; }); try { // 设置超时 2 秒 Integer result = future.get(2, TimeUnit.SECONDS); System.out.println("Result: " + result); } catch (TimeoutException e) { System.out.println("Task timed out."); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } executorService.shutdown(); }}php742 Bytes© 菜鸟-创作你的创作Future.cancel() 可以用于取消任务,但只有在任务尚未开始执行或正在执行时才有可能成功取消。如果任务已经完成或者已被取消,cancel() 会返回 false。
import java.util.concurrent.*;public class CancelTaskExample { public static void main(String[] args) throws InterruptedException { ExecutorService executorService = Executors.newSingleThreadExecutor(); // 提交一个任务 Future<?> future = executorService.submit(() -> { try { Thread.sleep(5000); System.out.println("Task completed."); } catch (InterruptedException e) { System.out.println("Task was interrupted."); } }); // 等待一秒后取消任务 Thread.sleep(1000); boolean cancelled = future.cancel(true); System.out.println("Task cancelled: " + cancelled); executorService.shutdown(); }}php740 Bytes© 菜鸟-创作你的创作Callable 是一个可以返回结果的任务接口,它与 Runnable 相似,但不同之处在于它能返回计算结果,并且能够抛出异常。与 Runnable 结合使用时,任务的执行结果无法返回;而与 Callable 一起使用时,可以通过 Future 获取任务执行的结果。
import java.util.concurrent.*;public class CallableFutureExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newFixedThreadPool(2); // 使用Callable接口创建任务 Callable<Integer> task = () -> { Thread.sleep(2000); return 123; }; // 提交任务,获取Future对象 Future<Integer> future = executorService.submit(task); // 获取任务结果 Integer result = future.get(); System.out.println("Result: " + result); // 输出 123 executorService.shutdown(); }}php627 Bytes© 菜鸟-创作你的创作Future 是用于处理异步任务的接口,可以帮助你获取任务的执行结果、取消任务以及检查任务的状态。ExecutorService.submit() 提交任务后返回一个 Future 对象,你可以通过 get() 方法等待并获取任务的结果。Future.get(long timeout, TimeUnit unit) 方法允许你设置超时,避免长时间阻塞。cancel() 方法允许取消任务,但只能在任务尚未开始执行时或执行过程中有效。Callable 接口和 Future 一起使用,可以返回任务的结果,适用于需要返回计算结果的场景。Future 机制适用于各种并发编程场景,特别是当你需要从多个任务中收集结果或处理错误时。https://www.52runoob.com/archives/4482
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。