xylz,imxylz

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

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  111 随笔 :: 10 文章 :: 2679 评论 :: 0 Trackbacks

 

我们知道线程是有多种执行状态的,同样管理线程的线程池也有多种状态。JVM会在所有线程(非后台daemon线程)全部终止后才退出,为了节省资源和有效释放资源关闭一个线程池就显得很重要。有时候无法正确的关闭线程池,将会阻止JVM的结束。

线程池Executor是异步的执行任务,因此任何时刻不能够直接获取提交的任务的状态。这些任务有可能已经完成,也有可能正在执行或者还在排队等待执行。因此关闭线程池可能出现一下几种情况:

  • 平缓关闭:已经启动的任务全部执行完毕,同时不再接受新的任务
  • 立即关闭:取消所有正在执行和未执行的任务

另外关闭线程池后对于任务的状态应该有相应的反馈信息。

图1 描述了线程池的4种状态。

  • 线程池在构造前(new操作)是初始状态,一旦构造完成线程池就进入了执行状态RUNNING。严格意义上讲线程池构造完成后并没有线程被立即启动,只有进行“预启动”或者接收到任务的时候才会启动线程。这个会后面线程池的原理会详细分析。但是线程池是出于运行状态,随时准备接受任务来执行。
  • 线程池运行中可以通过shutdown()和shutdownNow()来改变运行状态。shutdown()是一个平缓的关闭过程,线程池停止接受新的任务,同时等待已经提交的任务执行完毕,包括那些进入队列还没有开始的任务,这时候线程池处于SHUTDOWN状态;shutdownNow()是一个立即关闭过程,线程池停止接受新的任务,同时线程池取消所有执行的任务和已经进入队列但是还没有执行的任务,这时候线程池处于STOP状态。
  • 一旦shutdown()或者shutdownNow()执行完毕,线程池就进入TERMINATED状态,此时线程池就结束了。
  • isTerminating()描述的是SHUTDOWN和STOP两种状态。
  • isShutdown()描述的是非RUNNING状态,也就是SHUTDOWN/STOP/TERMINATED三种状态。

 

Executor-Lifecycle

图1

线程池的API如下:

ExecutorService-LifeCycle

图2

其中shutdownNow()会返回那些已经进入了队列但是还没有执行的任务列表。awaitTermination描述的是等待线程池关闭的时间,如果等待时间线程池还没有关闭将会抛出一个超时异常。

对于关闭线程池期间发生的任务提交情况就会触发一个拒绝执行的操作。这是java.util.concurrent.RejectedExecutionHandler描述的任务操作。下一个小结中将描述这些任务被拒绝后的操作。

 

总结下这个小节:

  1. 线程池有运行、关闭、停止、结束四种状态,结束后就会释放所有资源
  2. 平缓关闭线程池使用shutdown()
  3. 立即关闭线程池使用shutdownNow(),同时得到未执行的任务列表
  4. 检测线程池是否正处于关闭中,使用isShutdown()
  5. 检测线程池是否已经关闭使用isTerminated()
  6. 定时或者永久等待线程池关闭结束使用awaitTermination()操作

 



©2009-2014 IMXYLZ |求贤若渴
posted on 2011-01-04 22:54 imxylz 阅读(9990) 评论(6)  编辑  收藏 所属分类: Java Concurrency

评论

# re: 深入浅出 Java Concurrency (30): 线程池 part 3 Executor 生命周期 2011-01-04 23:02 yeshucheng
lz你写的东西,是时候把它转成PDF附件,这样以后阅读更方便。  回复  更多评论
  

# re: 深入浅出 Java Concurrency (30): 线程池 part 3 Executor 生命周期 2011-01-04 23:04 yeshucheng
感觉你这里还少了几个状态的介绍,呵呵  回复  更多评论
  

# re: 深入浅出 Java Concurrency (30): 线程池 part 3 Executor 生命周期 2011-01-04 23:05 xylz
@yeshucheng
这个建议不错,整理完成了来一个完整的PDF吧,每一节搞一个PDF闲麻烦  回复  更多评论
  

# re: 深入浅出 Java Concurrency (30): 线程池 part 3 Executor 生命周期 2011-01-04 23:06 xylz
@yeshucheng
还有么?这个状态是线程池的,不是线程的状态。  回复  更多评论
  

# re: 深入浅出 Java Concurrency (30): 线程池 part 3 Executor 生命周期 2012-11-14 11:14 yufeng
有isTerminating 这个方法?
isShutdown 和 isTerminated 的意思好像不太对哦。。  回复  更多评论
  

# re: 深入浅出 Java Concurrency (30): 线程池 part 3 Executor 生命周期[未登录] 2014-08-25 11:46 nemo
请问ThreadPoolExecutor是否有查看线程池是否空闲,当前有多少个线程正在工作的接口呢....

我submit一个runnable接口任务,最后怎样来确认这些在线程池中的任务都完成了呢?  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
 

©2009-2014 IMXYLZ