深入浅出 java concurrency (29): 线程池 part 2 executor 以及executors -凯发k8网页登录

关注后端架构、中间件、分布式和并发编程

   :: 凯发k8网页登录首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  111 随笔 :: 10 文章 :: 2680 评论 :: 0 trackbacks

java里面线程池的顶级接口是executor,但是严格意义上讲executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是executorservice。

下面这张图完整描述了线程池的类体系结构。

首先executor的execute方法只是执行一个runnable的任务,当然了从某种角度上将最后的实现类也是在线程中启动此任务的。根据线程池的执行策略最后这个任务可能在新的线程中执行,或者线程池中的某个线程,甚至是调用者线程中执行(相当于直接运行runnable的run方法)。这点在后面会详细说明。

executorservice在executor的基础上增加了一些方法,其中有两个核心的方法:

  • future submit(runnable task)
  • future submit(callable task)

这两个方法都是向线程池中提交任务,它们的区别在于runnable在执行完毕后没有结果,callable执行完毕后有一个结果。这在多个线程中传递状态和结果是非常有用的。另外他们的相同点在于都返回一个future对象。future对象可以阻塞线程直到运行完毕(获取结果,如果有的话),也可以取消任务执行,当然也能够检测任务是否被取消或者是否执行完毕。

在没有future之前我们检测一个线程是否执行完毕通常使用thread.join()或者用一个死循环加状态位来描述线程执行完毕。现在有了更好的方法能够阻塞线程,检测任务执行完毕甚至取消执行中或者未开始执行的任务。

 

scheduledexecutorservice描述的功能和timer/timertask类似,解决那些需要任务重复执行的问题。这包括延迟时间一次性执行、延迟时间周期性执行以及固定延迟时间周期性执行等。当然了继承executorservice的scheduledexecutorservice拥有executorservice的全部特性。

 

threadpoolexecutor是executorservice的默认实现,其中的配置、策略也是比较复杂的,在后面的章节中会有详细的分析。

scheduledthreadpoolexecutor是继承threadpoolexecutor的scheduledexecutorservice接口实现,周期性任务调度的类实现,在后面的章节中会有详细的分析。

这里需要稍微提一下的是completionservice接口,它是用于描述顺序获取执行结果的一个线程池包装器。它依赖一个具体的线程池调度,但是能够根据任务的执行先后顺序得到执行结果,这在某些情况下可能提高并发效率。

 

要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在executors类里面提供了一些静态工厂,生成一些常用的线程池。

  • newsinglethreadexecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
  • newfixedthreadpool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
  • newcachedthreadpool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说jvm)能够创建的最大线程大小。
  • newscheduledthreadpool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
  • newsinglethreadscheduledexecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。

在详细讲解threadpoolexecutor的时候会具体讨论上述参数配置后的意义和原理。

线程池是一个复杂的任务调度工具,因此它涉及到任务、线程池等的生命周期问题,在下一节中来探讨下这个问题。

 



©2009-2014 imxylz
|求贤若渴
posted on 2010-12-21 23:32 imxylz 阅读(13596) 评论(4)     所属分类: j2eejava concurrency
# re: 深入浅出 java concurrency (29): 线程池 part 2 executor 以及executors 2010-12-22 23:09
一直在看你写的连载,呵呵。

ps:类图用什么工具画的?  回复  
  

# re: 深入浅出 java concurrency (29): 线程池 part 2 executor 以及executors 2010-12-23 14:09 xylz
@yeshucheng

enterprise architect  回复  
  

# re: 深入浅出 java concurrency (29): 线程池 part 2 executor 以及executors 2015-01-27 14:44
写得很不错,持续学习中  回复  
  

# re: 深入浅出 java concurrency (29): 线程池 part 2 executor 以及executors 2016-03-21 16:22
@yeshucheng
jude,  回复  
  


©2009-2014
网站地图