什么是Executor框架?
我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗, 提高响应速度等。线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从JDK1.5 开始,为了把工作单元与执行机制分离开,Executor框架诞生了,他是一个用于统一创建与 运行的接口。Executor框架实现的就是线程池的功能。
Executor框架包括3大部分:
1、 任务。也就是工作单元,包括被执行任务需要实现的接口: Runnable接口或者Callable 接口;
2、 任务的执行。也就是把任务分派给多个线程的执行机制,包括Executor接口及继承自 Executor 接口的 ExecutorService 接口。
3、 异步计算的结果。包括Future接口及实现了 Future接口的FutureTask类。
executor提供了工厂的方法来创建线程池,返回的线程池都实现了 ExecutorService接口。
public static ExecutorService newFixedThreadPool(int n)
1、 创建固定数目的线程的线程池。
2、 newFixedThreadPool于cacheThreadPool差不多。也是能reuse就用,但是不能随时创 建新的线程;
3、 任意时间点,只能够最多有固定的数目的线程存在,此时如果有新的线程的创建,只能放 在等待队列中,只有当线程池中的一些线程终止被扔出线程池后,才进入线程池进行运行。
4、 和 cacheThreadPool 不同,FixedThreadPool 没有 IDLE 机制,所以 FixedThreadPool 多 数针对于很稳定的线程开发,多用于服务器。
5、 fixedThreadPool和cacheThreadPool —样,同用一个底层池,只不过参数不同,fix线
程固定,并且是 OsIDLE 无 IDLE; cache 线程支持 O-Integer.MAX_VALUE, 60s 的 IDLE。
public static ExecutorService newCacheThreadPool()
1、 创建一个可缓存池,调用execute将重用以前构造的线程(如果能够使用的话)。如果没有
线程可用,那么创建一个线程到线程池中。终止并移除线程池中超过60s没有被使用过的线程。
2、 缓存池一般用于运行生存期很短的异步线程任务。
3、 放入cacheThreadPoo1中的线程不用担心其结束,超时后会被自动终止。
4、 缺省值 timeout=60s
public static ExecutorService newSingleThreadExecutor()
1、 创建一个单线程化的Executor。
2、 用的是和cache和fixed池子相同的底层池,无IDLE。
public static ScheduleExecutorService newSchedu1eThreadPoo1(int corePoolSize)
创建一个支持定时及周期性的任务执行的线程池,多数情况可以代替Timer类。Timer存在以下缺陷
1、 Timer类不管启动多少定时器,但它只会启动一条线程,当有多个定时任务时,就会产生 延迟。如:我们要求一个任务每隔3S执行,且执行大约需要10S,第二个任务每隔5S执行, 两个任务同时启动。若使用Timer我们会发现,第而个任务是在第一个任务执行结束后的5S 才开始执行。这就是多任务的延时问题。
2、 若多个定时任务中有一个任务抛异常,那所有任务都无法执行。
3、 Timer执行周期任务时依赖系统时间。若系统时间发生变化,那Timer执行结果可能也会 发生变化。而ScheduledExecutorService基于时间的延迟,并非时间,因此不会由于系统时 间的改变发生执行变化。综上所述,定时任务要使用ScheduledExecutorService取代Timer。
Was this helpful?
0 / 0