Executor ExecutorService Executors Runnable Callable Future FutureTask

本文介绍了Java并发编程的基础概念,包括Executor、ExecutorService、Executors、Runnable、Callable、Future及FutureTask等核心接口与类的使用方法,解释了它们之间的区别与联系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Executor    执行接口  只有一个方法  void execute(Runnable command)  用来执行任务
ExecutorService  是接口Executor的子类 同时提供对线程池的关闭,执行,等方法
Executors 提供一些静态方法用于创建各种类型的线程池

Runnable  是一个接口,使用很简单
1.实现该接口,重写run方法
2.创建线程
3.线程启动后就会调用该对象的run方法
通常在开发中结合 ExecutorService 使用 ,将任务的提交与执行解耦开来
相对于Callable 以及 Future, Runnable方法不返回任务执行结果并且不能抛出异常


Callable
与Runnable 不同的是,Callable是个泛型参数化接口,并能返回线程的执行结果,并且能在无法计算时抛出异常
V call() throws Exception;
1.Callable并不像Runnable那样通过Thread的start方法就能启动实现类的run方法,所以他通常是利用ExecutorService的submit方法去启动call方法自执行任务
而ExecutorService的submit又返回一个Future类型的结果,因此Callable通常也和Future一起使用
或者利用FutureTask封装Callable再由Thread去启动(少用)
通过Executors.callable(Runnable task,T result)可以执行Runnable并返回结果,但是这个结果并不是Runnable的执行结果,而是执行者预定义的结果


Runnable与Callable不同点
1.Runnable不返回任务执行结果,Callable可返回任务执行结果
2.Callable在任务无法计算结果时抛出异常,Runnable不能
3.Runnable任务可直接有Thread的start方法或ExecutorService的submit方法去执行


Future
保存异步计算的结果,可以在我们执行任务时去做其它的工作,并提供了一下几个方法
cancel(boolean mayInterruptIfRunning):试图取消执行的任务,参数为true时直接中断正在执行的任务,否则直到当前任务执行完成,成功取消后返回true,否则返回false
isCancel():判断任务是否在正常执行完前被取消的,如果是则返回true
isDone():判断任务是否已完成
get():等待计算结果的返回,如果计算被取消了则抛出
get(long timeout,TimeUtil unit):设定计算结果的返回时间,如果在规定时间内没有返回计算结果则抛出TimeOutException
使用Future的好处
1. 获取任务的结果,判断任务是否完成,中断任务
1. Future的get方法很好的替代的了Thread.join或Thread,join(long millis)
2. Future的get方法可以判断程序代码(任务)的执行是否超时


FutureTask
FutureTask 实现了RunnableFuture接口,提供了即可以使用Runnable来执行任务,又可以使用Future执行任务并取得结果的构造器,
所以可以利用FutureTask去封装Runnable或Callable对象,之后在submit任务
### Java 多线程中的 CallableRunnableFutureFutureTask #### Callable 接口 `Callable<V>` 是一个类似于 `Runnable` 的接口,但是它可以返回结果并抛出异常。这使得它非常适合用于那些需要返回计算结果的任务。 ```java public interface Callable<V> { V call() throws Exception; } ``` 通过实现 `call()` 方法,可以在任务完成后获得返回值[^4]。 #### Runnable 接口 `Runnable` 是最常用的并发编程接口之一,通常用于定义不带返回值的任务。该接口只包含一个无参数的方法: ```java public interface Runnable { void run(); } ``` 由于 `run()` 不支持返回值也不允许声明受检异常,因此适用于不需要反馈结果的简单任务。 #### Future 接口 `Future<V>` 表示异步计算的结果。此接口提供了检查计算是否完成、等待其完成以及检索结果的方法。值得注意的是,在获取结果之前如果任务尚结束,则会阻塞当前线程直到任务完成为止。 ```java public interface Future<V> { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; } ``` 这些特性让开发者能够更好地管理长时间运行的操作而不会影响主线程的工作流程[^3]。 #### FutureTask 类 作为实现了 `RunnableFuture<V>` 接口的具体类,`FutureTask<T>` 可以包装 `Callable<V>` 或者 `Runnable` 对象来进行更复杂的操作处理。除了继承自父级的所有功能外,还增加了对状态变化的支持(比如设置已完成的状态),从而简化了多线程环境下的开发工作量。 ```java public class FutureTask<V> implements RunnableFuture<V> ``` 当传入的是 `Callable` 实例时可以直接调用它的 `get()` 来取得最终结果;如果是普通的 `Runnable` 则默认认为是没有输出值的情况[^5]。 ### 使用场景与代码实例 对于只需要执行某些动作而不关心它们产生的任何数据的情形下可以选择使用 `Runnable` 。然而当我们希望得到一些有用的信息或者是遇到可能失败的任务时就应该考虑采用 `Callable` 加上相应的错误捕捉机制来代替传统的做法。 下面给出几个简单的例子展示如何利用上述组件构建高效的并发应用程序: - **仅需执行任务** ```java // 创建一个新的线程并启动之 Thread thread = new Thread(new Task()); thread.start(); static class Task implements Runnable { @Override public void run() { System.out.println("Executing task..."); } } ``` - **带有返回值的任务** ```java ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> { int sum = 0; for (int i=1;i<=100;++i){ sum += i; } return sum; }); try{ Integer result = future.get(); // 阻塞直至任务完成 }catch(Exception e){ e.printStackTrace(); } executor.shutdownNow(); ``` - **组合使用 FutureTask** ```java ExecutorService pool = Executors.newFixedThreadPool(2); // 将 Callable 转换成 FutureTask FutureTask<String> ft1 = new FutureTask<>(new MyCallable()); pool.execute(ft1); // 提交到线程池中去跑 String res = null; if (!ft1.isDone()){ try { res = ft1.get(); // 获取结果前先判断是否已经完成了 } catch (InterruptedException | ExecutionException ex) { Logger.getLogger(Test.class.getName()).log(Level.SEVERE,null,ex); } } System.out.printf("Result from FutureTask: %s\n",res); pool.shutdown(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值