面试题答案
一键面试Executor框架的核心组件及其作用
- Executor
- 作用:是一个顶层接口,它定义了一个接收Runnable对象的方法
execute
,其目的是将任务的提交和任务的执行分离开来。这样使得我们可以用不同的方式来执行任务,而不用在调用处写具体的执行逻辑。例如,在简单的单线程环境中,可以直接在当前线程执行任务;在多线程环境中,可以将任务交给线程池执行。
- 作用:是一个顶层接口,它定义了一个接收Runnable对象的方法
- ExecutorService
- 作用:继承自
Executor
接口,提供了生命周期管理的方法,如shutdown
和shutdownNow
,用于关闭线程池。同时还提供了提交任务的方法,如submit
,该方法不仅可以提交Runnable任务,还可以提交Callable任务,并返回一个Future对象用于获取任务执行结果。
- 作用:继承自
- ScheduledExecutorService
- 作用:继承自
ExecutorService
接口,支持任务的定时执行和周期性执行。例如,scheduleAtFixedRate
方法可以按照固定的速率执行任务,scheduleWithFixedDelay
方法可以按照固定的延迟执行任务。这在需要定时执行某些任务,如定时备份数据、定时检查系统状态等场景中非常有用。
- 作用:继承自
- ThreadPoolExecutor
- 作用:
ExecutorService
接口的主要实现类,用于创建线程池。它可以根据核心线程数、最大线程数、存活时间等参数灵活地管理线程。核心线程数表示线程池中会一直存活的线程数量,即使这些线程处于空闲状态;最大线程数则限制了线程池能够容纳的最大线程数量。当任务队列已满且线程数小于最大线程数时,会创建新的线程来处理任务。存活时间定义了非核心线程在空闲状态下能够存活的时间,超过这个时间,非核心线程会被销毁。
- 作用:
- ScheduledThreadPoolExecutor
- 作用:继承自
ThreadPoolExecutor
并实现了ScheduledExecutorService
接口,用于创建支持定时和周期性任务执行的线程池。它结合了线程池的资源管理和定时任务执行的功能,适用于需要按计划执行任务的场景,如定时更新缓存、定时发送消息等。
- 作用:继承自
- Future
- 作用:表示异步计算的结果。通过
Future
可以检查任务是否完成(isDone
方法),等待任务完成(get
方法),还可以取消任务(cancel
方法)。对于提交Callable任务返回的Future
,可以通过get
方法获取任务执行的返回值。
- 作用:表示异步计算的结果。通过
- FutureTask
- 作用:实现了
Future
和Runnable
接口,既可以作为Runnable
被线程执行,也可以作为Future
得到任务的执行结果。它是一种方便的方式来包装Callable或Runnable任务,使得可以异步执行任务并获取结果。
- 作用:实现了