并发--线程池简介
Posted 李晓娜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发--线程池简介相关的知识,希望对你有一定的参考价值。
通常情况下,当我们使用一个线程的时候,采用new方式去创建一个线程,这样实现起来很方便,但是与此同时存在一个问题:大量创建线程,会带来资源的消耗,并且如果并发的数量很多的时候,并且每个线程的执行时间很短的话,频繁创建线程会很消耗效率,因为频繁创建和销毁线程是一个很耗时间的过程。
如何使得线程可以复用,即执行完毕并不会销毁,进而可以执行其他的任务,那该多好啊,在java中可以通过线程池来达到这样的效果。
那么线程池是一个什么样的工作流程呢?
我们知道大量请求并发访问的时候,服务器不断地创建和销毁对象的开销很大,所以提高服务器效率的一个手段就是尽可能的减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。于是基于这个,我们引入“池”的概念。何为“池”,“池”就是使得人们可以定制一定量的资源,之后对这些资源进行复用,而非频繁的创建和销毁。
线程池是预先创建线程的一种技术,并不是在任务到来之际创建,而是到来之前创建,并且是创建一定数量的线程,放入空闲队列中,这些线程都是处于休眠的状态,虽是启动,但是并不消耗CPU,只是占用很小的内存空间。
只有当请求到来的时候,线程池给这次请求分配一个空闲线程进行处理,当请求数目超过预定创建的线程时候,线程池可以自由创建一定数量的新线程,当系统大部分线程处于空闲的时候,此时线程池可以移除一部分处于停用状态的线程。
那如果这样的话,是不是线程池创建的线程数量越多越好呢?其实不是这样的,线程池使用需要注意的是线程池大小与性能,并发,死锁,资源不足以及线程泄露等问题。
值得注意的是:
1. 线程池大小,并不是越多越好,与系统运行的软硬件有关系,一般建议与CPU数量相适合最好。
2. 并发错误,多线程容易出现并发错误。
3. 线程泄露,任务执行完毕但是线程并未返回线程池导致线程泄露。
下节讲解线程池的分类使用~
以上是关于并发--线程池简介的主要内容,如果未能解决你的问题,请参考以下文章
JUC并发编程 共享模式之工具 ThreadPoolExecutor 多线程设计模式 -- 异步模式之工作线程(定义饥饿 & 解决饥饿 & 线程池创建多少线程数目合适)