JUC-Future<V> 接口
在 Java 中,Future<V>
接口位于 java.util.concurrent
包下,用于表示异步计算的结果。它提供了一系列方法来管理和获取异步任务的执行状态和结果,以下是对 Future<V>
接口中主要方法的详细解析。
1. boolean cancel(boolean mayInterruptIfRunning)
- 功能:尝试取消异步任务的执行。
- 参数: mayInterruptIfRunning:一个布尔值,如果为 true 且任务正在执行,那么会尝试中断任务;如果为 false,则不会中断正在执行的任务。
- 返回值:如果任务在调用
cancel
方法前还未开始,那么任务会被取消并返回true
;如果任务已经完成、已经被取消或者由于其他原因无法取消,那么返回false
。 - 示例代码:
import java.util.concurrent.*; public class FutureCancelExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return 10; }); // 尝试取消任务 boolean cancelled = future.cancel(true); System.out.println("任务是否取消成功: " + cancelled); executor.shutdown(); } }
2. boolean isCancelled()
- 功能:判断任务是否被取消。
- 返回值:如果任务在正常完成之前被取消,返回
true
;否则返回false
。 - 示例代码:
import java.util.concurrent.*; public class FutureIsCancelledExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return 10; }); // 尝试取消任务 future.cancel(true); // 判断任务是否被取消 boolean isCancelled = future.isCancelled(); System.out.println("任务是否被取消: " + isCancelled); executor.shutdown(); } }
3. boolean isDone()
- 功能:判断任务是否已经完成。任务完成包括正常结束、抛出异常或者被取消。
- 返回值:如果任务已经完成,返回
true
;否则返回false
。 - 示例代码:
import java.util.concurrent.*; public class FutureIsDoneExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return 10; }); try { // 等待一段时间 Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // 判断任务是否完成 boolean isDone = future.isDone(); System.out.println("任务是否完成: " + isDone); executor.shutdown(); } }
4. V get()
throws InterruptedException, ExecutionException
- 功能:获取异步任务的结果。如果任务还未完成,调用该方法的线程会被阻塞,直到任务完成。
- 返回值:任务的执行结果。
- 异常: InterruptedException:如果在等待过程中线程被中断。ExecutionException:如果任务在执行过程中抛出异常,该异常会被封装在 ExecutionException 中抛出。
- 示例代码:
import java.util.concurrent.*; public class FutureGetExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return 10; }); try { // 获取任务结果 Integer result = future.get(); System.out.println("任务结果: " + result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } executor.shutdown(); } }
5. V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException
- 功能:在指定的时间内获取异步任务的结果。如果在超时时间内任务还未完成,会抛出
TimeoutException
异常。 - 参数: timeout:超时时间。unit:超时时间的单位,如 TimeUnit.SECONDS、TimeUnit.MILLISECONDS 等。
- 返回值:任务的执行结果。
- 异常: InterruptedException:如果在等待过程中线程被中断。ExecutionException:如果任务在执行过程中抛出异常,该异常会被封装在 ExecutionException 中抛出。TimeoutException:如果在指定的超时时间内任务还未完成。
- 示例代码:
import java.util.concurrent.*; public class FutureGetWithTimeoutExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } return 10; }); try { // 在 2 秒内获取任务结果 Integer result = future.get(2, TimeUnit.SECONDS); System.out.println("任务结果: " + result); } catch (InterruptedException | ExecutionException | TimeoutException e) { System.out.println("异常信息: " + e.getMessage()); } executor.shutdown(); } }
通过这些方法,你可以方便地管理和获取异步任务的执行状态和结果,从而实现高效的异步编程。
JUC编程 文章被收录于专栏
JUC 是 Java.util.concurrent 包的简称,它是 Java 5 引入的一个用于处理并发编程的工具包,为 Java 开发者提供了一系列用于高效处理并发任务的类和接口,极大地简化了多线程编程的复杂性。