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 开发者提供了一系列用于高效处理并发任务的类和接口,极大地简化了多线程编程的复杂性。

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务