多线程管理之执行器
1. 执行器简介
在实现简单的并发应用程序时,通常会为每个并发任务创建并执行一个线程。但这种方法存在一些问题,例如创建过多线程可能会降低应用程序的性能,甚至导致整个系统挂起。
自 Java 5 起,Java 并发 API 引入了执行器框架,以解决这些问题并提供一种高效的解决方案。执行器框架具有以下基本特点:
- 无需创建任何 Thread 对象。只需创建任务实例(如实现 Runnable 接口的类)并将其发送给执行器,执行器会管理执行任务的线程。
- 通过重用线程减少线程创建带来的开销。执行器内部管理着一个名为工作线程的线程池。若有空闲的工作线程,执行器会使用该线程执行任务。
- 易于控制执行器使用的资源。可以限制执行器的最大工作线程数。若任务数超过工作线程数,执行器会将任务存储在队列中,工作线程完成任务后会从队列中获取下一个任务。
- 必须显式结束执行器的执行。需要告知执行器结束执行并终止已创建的线程,否则执行器不会停止,应用程序也不会结束。
执行器框架的基本组件如下:
- Executor 接口 :执行器框架的基本接口,仅定义了一个允许程序员将 Runnable 对象发送给执行器的方法。
- ExecutorService 接口 :扩展了 Executor 接口,包含更多方法以增强框架功能,例如:
- 执行返回结果的任务:Runnable 接口的 run() 方法不返回结果,但使用执行器可以有返回结果的任务。
- 用单个方法调用执行任务列表。
- 结束执行器的执行并等待其终止。
-