JAVA线程池的理解

本文只是对线程池基本概念的总结。


new Thread(new Runnable。。。)相信大家都写过,它表示的意义也很明显,我把一个runnable任务交给一个新建的线程让他执行。如果是简单的几个任务并发这就没什么问题,但是如果要同时处理许多任务或者面对更加复杂的情况的时候,频繁的创建和销毁线程带来的开销,或者线程争夺资源导致效率低下都会发生。这时候就需要线程池,一个承担全部创建线程销毁线程,以及为线程分配任务的工具。

当我们按照具体场景定制出线程池后,调用他的execute方法直接把runnable任务交给他就可以了。


1.工作流程:

具体的工作流程是这样的:线程池收到一个任务后,优先把任务交给闲置的核心线程(线程池把线程分为核心线程和非核心线程,任务优先交给核心线程),如果没有闲置的核心线程就将任务打入一个任务队列中,接下来任务的分配交给这个队列。


2.线程的生命周期:

存在一个变量time : 线程停留时间

默认的情况下,核心线程会一直存活,非核心线程闲置后停留time后销毁。如果设置allowCoreThreadTimeOut为true,则核心线程和非核心线程一样,闲置后停留time销毁。


2.定制参数:

线程池在JAVA中表现为实现了Executor的ThreadPoolExecutor类,通过他多个参数的构造器就可以定制出一个线程池。这个类有5.6.7个参数的方法,一般用五个参数的就可以,另外两个参数是错误时的抛出异常和为线程命名,一般不用考虑。

五个参数分别是:最大核心线程数,最大总线程数,停留时间,停留时间单位(秒,毫秒等枚举值),任务队列。


2.常用的任务队列类型:

SynchronousQueue:不保留任务,直接新建一个线程执行任务。为了避免线程数超出最大线程数,maximumPoolSize 一般指定成 Integer.MAX_VALUE,即无限大

LinkedBlockingQueue:如果可以新建核心线程就新建核心线程执行,不能就在队列里放着,没有最大值限制,所有任务都将被添加到队列中,maximumPoolSize 的设定失效。

ArrayBlockingQueue:可以限定长度的队列,如果可以新建核心线程就新建核心线程执行,不能就在队列里放着,线程数达到最大时新建非核心线程执行。

DelayQueue:队列内元素必须实现 Delayed 接口,这就意味着你传进去的任务必须先实现 Delayed 接口。这个队列接收到任务时,首先先入队,只有达到了指定的延时时间,才会执行任务


了解了这些,JAVA自己定义好的几种线程池也就能够看懂了。

更多:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650239804&idx=1&sn=3df2deb8eb577d577bcfb24588719365&chksm=88638253bf140b45b2d81e8e57611eb0d3284a0dbf9cbc28abbf2c8868497ca38a8f84efc3b1&mpshare=1&scene=23&srcid=08212LFrZf57BUGEdsObzCj0#rd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值