JavaSe系列——Java自带的线程池

1. 线程池的做用缓存

线程池的创建为线程生命周期开销问题和资源不足问题提供了解决方案。经过对多个任务重用线程,线程建立的开销被分摊到了多个任务上。其好处是,由于在请求到达时线程已经存在,因此无心中也消除了线程建立所带来的延迟。这样,就能够当即为请求服务,使应用程序响应更快。并且,经过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到得到一个线程来处理为止,从而能够防止资源不足。并发

2. 使用线程池的风险线程

死锁 (全部线程池都在执行一个在等待队列任务的执行结果)生命周期

资源不足 (线程池大小设置不合理形成资源不足)队列

并发错误 (线程池和其它排队机制依靠使用 wait() 和 notify() 方法,这两个方法都难于使用,形成并发错误)资源

线程泄露 (a. 当线程在任务完成后没有返回池。b. 当发生RuntimeException异常或Error时,线程池没有捕捉到它们时。)it

请求过载 (请求过多)io

经常使用的几种线程池效率

- newCachedThreadPool线程池

这是一种可缓存线程池,若是线程长度超过处理需求,可灵活回收空闲线程,若无可回收,则新建线程。

特色

(1). 建立数量几乎没有限制(可经过Interger.MAX_VALUE调整)

(2). 若长时间没有提交任务,则该工做线程将自动终止(默认空闲时间为1分钟)。结束后,须要从新建立。

(3). 须要控制任务的数量,过大容易形成系统瘫痪。

- newFixedThreadPool

建立一个指定工做线程数量的线程池,每当提交一个任务就建立一个工做线程,若是工做线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。优势:可以提升程序效率和节省建立线程时所耗的开销,缺点:当没有可执行任务时,它不会释放工做线程,还会占用一顶的系统资源。

- newSingleThreadExcutor

建立一个单线程化的Executor(惟一的工做者线程),保证全部任务按照指定顺序(FIFO,LIFO,优先级)执行,若是出现异常,则会有另外一个线程代替它,最大优势和特色就是保证顺序执行各个任务,而且在任意给定的时间不会有多个线程时活动的。

- newScheduleThreadPool

建立一个定长的线程池,且支持定时及周期性任务执行。

相关文章
相关标签/搜索