Executor框架
Executor框架
Executor 框架包含一组用于有效管理工作线程的组件。Executor API 通过
Executors
(工厂类角色) 将任务的执行与要执行的实际任务解耦。其中Executors提供了用于创建线程池的静态工厂方法
1.Executor框架概述:
Executor框架包含三大部分:
-
任务。也就是工作单元,包括被执行任务需要实现的接口:Runnable接口或者Callable接口。
-
任务的执行(线程池)。对线程进行管理,然后把任务通过轮询各种方式分派给线程池中的线程执行的机制。其中最顶层的接口为Executor接口以及继承Executor接口的ExecutorService接口。
-
异步计算结果的获取。包括Future接口及实现了Future接口的FutureTask类。
框架中主要的成员和关系可如下图所示
2.常见的线程池类型(都由Executors工厂类的静态方法产出)
2.1 SingleThreadExecutor(线程池内只会有一个线程)
此线程池 executor 只有一个线程。它用于以顺序方式的形式执行任务。如果此线程在执行任务时因异常而挂掉,则会创建一个新线程来替换此线程,后续任务将在新线程中执行。
ExecutorService executorService = Executors.newSingleThreadExecutor()
2.2 FixedThreadPool(所有任务只能使⽤固定数量的线程)
它是一个拥有固定数量线程的线程池。提交给 executor 的任务由固定的
n
个线程执行,如果有更多的任务,它们存储在LinkedBlockingQueue
里。这个数字n
通常跟底层处理器支持的线程总数有关。ExecutorService executorService = Executors.newFixedThreadPool(4);
2.3 CachedThreadPool(当没有空闲的线程时,⼀个任务创建⼀个线程)
该线程池主要用于执行大量短期并行任务的场景。与固定线程池不同,此线程池的线程数不受限制。如果所有的线程都在忙于执行任务并且又有新的任务到来了,这个线程池将创建一个新的线程并将其提交到 executor。只要其中一个线程变为空闲,它就会执行新的任务。 如果一个线程有 60 秒的时间都是空闲的,它们将被结束生命周期并从缓存中删除。
public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) { executorService.execute(new MyRunnable()); } executorService.shutdown(); }
2.4 ScheduledExecutor(可以让任务定时执行或者延时执行)
当我们有一个需要定期运行的任务或者我们希望延迟某个任务时,就会使用此类型的 executor。
ScheduledExecutorService scheduledExecService = Executors.newScheduledThreadPool(1); scheduledExecService.scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) scheduledExecService.scheduleWithFixedDelay(Runnable command, long initialDelay, long period, TimeUnit unit)
这两种方法的主要区别在于它们对连续执行定期任务之间的延迟的应答。
scheduleAtFixedRate
:无论前一个任务何时结束,都以固定间隔执行任务。scheduleWithFixedDelay
:只有在当前任务完成后才会启动延迟倒计时。