返回
Java多线程第十三篇:一网打尽Runnable、Callable、Future、RunnableFuture、FutureTask
后端
2024-02-21 08:28:00
多线程编程的五位主角:Runnable、Callable、Future、RunnableFuture、FutureTask
Runnable:轻量级的任务封装
Runnable是一个函数式接口,用于将任务包装成可执行的对象。它只有一个方法run()
,当调用run()
方法时,任务便会被执行。Runnable通常用于处理简单的任务,例如更新UI或执行耗时操作。
Callable:带返回值的任务封装
Callable与Runnable相似,但它有一个返回值。这使得Callable可以用于处理更复杂的任务,例如计算结果或从数据库中检索数据。Callable通常用于处理需要返回值的任务,例如在并行计算中计算π的值。
Future:任务执行的异步句柄
Future是一个接口,它表示一个异步计算的结果。它可以用于检查任务的状态,获取任务的返回值或取消任务的执行。Future通常用于处理需要长时间执行的任务,例如从网络中下载文件或执行复杂的计算。
RunnableFuture:既可执行任务又可获取结果
RunnableFuture是Runnable和Future的结合体。它既可以像Runnable一样执行任务,也可以像Future一样获取任务的返回值。RunnableFuture通常用于处理需要长时间执行的任务,例如从网络中下载文件或执行复杂的计算。
FutureTask:RunnableFuture的具体实现
FutureTask是RunnableFuture的一个具体实现。它提供了对任务状态的访问,允许取消任务的执行,并提供了对任务返回值的访问。FutureTask通常用于处理需要长时间执行的任务,例如从网络中下载文件或执行复杂的计算。
使用示例
public class Main {
public static void main(String[] args) {
// 创建一个Runnable任务
Runnable runnable = () -> System.out.println("Hello, world!");
// 创建一个Callable任务
Callable<String> callable = () -> {
// 耗时操作
Thread.sleep(1000);
return "Hello, world!";
};
// 创建一个FutureTask
FutureTask<String> futureTask = new FutureTask<>(callable);
// 创建一个线程池
ExecutorService executorService = Executors.newFixedThreadPool(2);
// 提交任务到线程池
executorService.submit(runnable);
executorService.submit(futureTask);
// 获取FutureTask的结果
try {
String result = futureTask.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
// 关闭线程池
executorService.shutdown();
}
}
总结
Runnable、Callable、Future、RunnableFuture和FutureTask是Java多线程编程中常用的五个概念。它们之间的区别和联系如下:
- Runnable是一个函数式接口,用于将任务包装成可执行的对象。
- Callable与Runnable相似,但它有一个返回值。
- Future是一个接口,它表示一个异步计算的结果。
- RunnableFuture是Runnable和Future的结合体。它既可以像Runnable一样执行任务,也可以像Future一样获取任务的返回值。
- FutureTask是RunnableFuture的一个具体实现。它提供了对任务状态的访问,允许取消任务的执行,并提供了对任务返回值的访问。

扫码关注微信公众号
修复Python中的"WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', NewConnectionError(': Fail'错误

Python连接列表元素:4大方法,助你成为数据拼接高手

Python 操作 MongoDB 教程:连接、插入、查询、更新和删除数据指南

新年代码浪漫:打造2023跨年烟花代码(Python)

建模达人抢先看!2022年数学建模国赛C题攻略来袭!
