当前位置: 首页 > news >正文

Java 线程相关的三个常见接口、类

1. Runnable

  • 最早期的接口,用来封装任务逻辑。
  • 没有返回值、不能抛出受检异常。
Runnable task = () -> System.out.println("Hello Runnable");
new Thread(task).start();

2. Callable<V>

  • JDK 1.5 引入,和 Runnable 类似,但 有返回值,可以抛出异常。
Callable<Integer> task = () -> {return 42;
};
ExecutorService pool = Executors.newSingleThreadExecutor();
Future<Integer> future = pool.submit(task);
System.out.println(future.get());  // 输出 42

3. Future<V>

  • 代表一个 异步任务的结果,用来获取 Callable 执行的返回值。
  • 提供了 get()cancel()isDone() 等方法。
Future<Integer> future = pool.submit(() -> 42);
if (!future.isDone()) {System.out.println("任务还没完成");
}
System.out.println(future.get()); // 阻塞等待返回 42

三者关系

  • Runnable只管执行,无返回值。
  • Callable可执行 + 有返回值
  • Future拿结果的票据,执行完后从这里取。
       Runnable                Callable│                        │▼                        ▼提交给 ExecutorService(线程池)│▼Future

一般配合线程池使用:

ExecutorService pool = Executors.newFixedThreadPool(3);
Future<String> f = pool.submit(() -> "Hello Callable");
System.out.println(f.get()); // 从 Future 拿结果

🔑 口诀

  • Runnable:干活,不给结果。
  • Callable:干活,能返回结果,还能抛异常。
  • Future:小票,凭票取结果。
特性RunnableCallable<V>Future<V>
所在包java.langjava.util.concurrentjava.util.concurrent
主要作用封装一个可执行任务封装一个可执行任务(可返回结果/抛异常)表示异步任务的结果/控制
核心方法void run()V call() throws Exceptionget()cancel()isDone()isCancelled()
返回值无返回值有返回值(泛型 V)保存并提供 Callable/Runnable 的执行结果
异常处理不能抛出受检异常可以抛出受检异常get() 时会封装为 ExecutionException 抛出
使用方式new Thread(runnable).start() 或提交到线程池提交到线程池执行提交任务时返回 Future 对象,用于获取结果
常见场景简单任务,不关心结果需要返回计算结果,或可能抛出异常异步任务结果获取、取消任务
http://www.dtcms.com/a/347242.html

相关文章:

  • pytorch与torchvision版本对应情况
  • SHAP分析+KOA-RIME开普勒结合霜冰算法双重优化BP神经网络+9种映射方法+新数据预测!机器学习可解释分析!
  • Excel 条件高亮工具,秒高亮显示符合筛选条件的行数据
  • 数据结构与算法-字符串、数组和广义表(String Array List)
  • pixijs基础学习
  • Huggingface入门实践 图像处理CV与多模态模型调用(二)
  • Android 之wifi连接流程
  • 用 Go + GitHub Models API 打造一个免费的 ChatBot
  • 金山办公的服务端开发工程师-25届春招笔试编程题
  • 密码实现安全基础篇 . KAT(已知答案测试)技术解析与实践
  • 微服务的编程测评系统15-头像上传-OSS
  • Ceph OSD 硬盘重连导致设备名变化
  • 访问网络附加存储
  • `strcat` 字符串连接函数
  • 一文学会vue的动态权限控制
  • 3.Shell 变量入门:变量定义、赋值、取值($var)及环境变量与局部变量区别详解
  • PYTHON让繁琐的工作自动化-列表
  • 07_模块和包
  • UNet改进(34):ACmix-UNet混合架构的PyTorch
  • 动手学深度学习(pytorch版):第六章节—卷积神经网络(1)从全连接层到卷积
  • 避开MES实施的“坑”:详解需求、开发、上线决胜点
  • 自动化知识工作AI代理的工程与产品实现
  • Node.js 和 Express 面试问题总结
  • Ubuntu通过 systemd 管理 gpt4free,需为其创建 g4f.service 文件,定义服务的启动、停止等操作(未实践)
  • Java基础 8.23
  • 【8位数取中间4位数】2022-10-23
  • LangChain4J-基础(整合Spring、RAG、MCP、向量数据库、提示词、流式输出)
  • QT-常用类
  • 【GPT入门】第57课 详解 LLamaFactory 与 XTuner 实现大模型多卡分布式训练的方案与实践
  • calchash.exe和chckhash.exe计算pe文件hash值的两个实用小工具