学习分享-FutureTask

前言

今天再改简历的时候回顾了之前实习用到的FutureTask,借此来回顾一下相关知识。

FutureTask 介绍

FutureTask 是 Java 并发包(java.util.concurrent)中的一个类,用于封装异步任务。它实现了 RunnableFuture 接口,而 RunnableFuture 接口继承了 RunnableFuture 接口。因此,FutureTask 既可以作为 Runnable 执行任务,也可以作为 Future 获取任务的结果。

主要功能
  • 任务执行:可以通过线程池或单独的线程执行 FutureTask
  • 结果获取:可以通过 Future 接口的 get 方法获取任务执行的结果。
  • 任务取消:可以通过 Future 接口的 cancel 方法取消任务的执行。
  • 任务状态查询:可以查询任务是否已经完成、是否被取消等状态。
主要方法
  • run():执行任务,当任务完成后设置其状态和结果。
  • get():等待任务执行完成,并返回结果。
  • cancel(boolean mayInterruptIfRunning):取消任务的执行。
  • isDone():检查任务是否已完成。
  • isCancelled():检查任务是否已被取消。
示例代码

以下是一个简单的 FutureTask 使用示例:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class FutureTaskExample {

    public static void main(String[] args) {
        // 创建一个 Callable 任务,它返回一个字符串结果
        Callable<String> callableTask = () -> {
            Thread.sleep(2000);
            return "Task completed";
        };

        // 使用 FutureTask 封装 Callable 任务
        FutureTask<String> futureTask = new FutureTask<>(callableTask);

        // 创建一个单线程的线程池
        ExecutorService executorService = Executors.newSingleThreadExecutor();

        // 提交 FutureTask 给线程池执行
        executorService.submit(futureTask);

        // 主线程执行其他操作
        System.out.println("Main thread is doing other work...");

        try {
            // 获取 FutureTask 执行结果
            String result = futureTask.get();
            System.out.println("FutureTask result: " + result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        // 关闭线程池
        executorService.shutdown();
    }
}
解释
  1. 创建任务:定义一个 Callable 任务,该任务会休眠 2 秒钟,然后返回字符串 “Task completed”。
  2. 封装任务:使用 FutureTaskCallable 任务封装起来。FutureTask 实际上就是一个可以异步执行的任务对象。
  3. 提交任务:将 FutureTask 提交给线程池执行。线程池会管理任务的执行,并将执行结果存储在 FutureTask 中。
  4. 主线程工作:在任务执行期间,主线程可以继续执行其他操作,不会被阻塞。
  5. 获取结果:调用 FutureTaskget 方法来获取任务的执行结果。如果任务还未完成,get 方法会阻塞,直到任务完成并返回结果。
  6. 关闭线程池:任务完成后,关闭线程池,释放资源。

FutureTask 提供了一种将 CallableRunnable 任务封装起来的机制,使得这些任务可以被异步执行,并且可以方便地获取任务的执行结果或取消任务。这使得编写并发程序更加简洁和高效。

相关推荐

  1. 学习分享-FutureTask

    2024-06-16 17:50:01       7 阅读
  2. **FutureTask应用&源码分析**(二)

    2024-06-16 17:50:01       33 阅读
  3. FutureTask源码阅读

    2024-06-16 17:50:01       40 阅读
  4. 学习方法分享

    2024-06-16 17:50:01       35 阅读
  5. Simulink学习教程分享

    2024-06-16 17:50:01       16 阅读
  6. C语言学习分享

    2024-06-16 17:50:01       12 阅读
  7. #经验分享#学习方法

    2024-06-16 17:50:01       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-16 17:50:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-16 17:50:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-16 17:50:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-16 17:50:01       20 阅读

热门阅读

  1. 基于深度学习的物体材质预测

    2024-06-16 17:50:01       8 阅读
  2. iOS cell的复用以及自定义cell

    2024-06-16 17:50:01       10 阅读
  3. lwip中server和client的socket、地址和端口号

    2024-06-16 17:50:01       10 阅读
  4. DOM的概念?获取html元素的方法有哪些?

    2024-06-16 17:50:01       7 阅读
  5. 深入浅出Python爬虫:掌握数据抓取的艺术

    2024-06-16 17:50:01       9 阅读
  6. lower_bound 和 upper_bound

    2024-06-16 17:50:01       8 阅读
  7. UOS常用命令

    2024-06-16 17:50:01       6 阅读
  8. Spring Boot 增删改查(mybatis-plus)

    2024-06-16 17:50:01       9 阅读
  9. Vue中双向数据绑定是如何实现的

    2024-06-16 17:50:01       10 阅读
  10. dev c++ “permission denied“解决方法

    2024-06-16 17:50:01       9 阅读
  11. 每天一个项目管理概念之敏捷项目管理

    2024-06-16 17:50:01       8 阅读
  12. MongoDB入门与实践

    2024-06-16 17:50:01       8 阅读
  13. 了解protoStuff

    2024-06-16 17:50:01       8 阅读
  14. 计算机网络期末复习

    2024-06-16 17:50:01       15 阅读