线程池

线程池

介绍

thread pool,是一种线程使用模式,是java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现。

  • 线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。
  • 如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

使用原因

创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程,再加上业务工作线程,消耗系统资源的时间,可能导致系统资源不足。(我们可以把创建和销毁的线程的过程去掉)

通过对多个任务复用线程,线程创建的开销被分担到多个任务上。当程序发起请求时,所需要的线程已经存在了,减少了创建线程带来的延迟,提高程序的响应速度。

作用

  • 提高效率: 创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。

  • 方便管理: 可以编写线程池管理代码对池中的线程同一进行管理,比如说启动时有该程序创建100个线程,每当有请求的时候,就分配一个线程去工作,如果刚好并发有101个请求,那多出的这一个请求可以排队等候,避免因无休止的创建线程导致系统崩溃。

种类及作用

newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。

newFixedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
很优秀的线程池,但是在线程池空闲时,不会释放工作线程,还会占用系统资源

newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
特点:

  • 工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。
  • 如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。
  • 在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。

newScheduledThreadPool

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

风险

死锁

死锁: 一个或多个线程等待一个只有其他线程才能触发的事件。
在线程池中可能会发生的一种情况,所有池线程都在执行已阻塞的等待队列中另一任务的执行结果的任务,但这一任务却因为没有未被占用的线程而不能运行。当线程池被用来实现涉及许多交互对象的模拟,被模拟的对象可以相互发送查询,这些查询接下来作为排队的任务执行,查询对象又同步等待着响应时,会发生这种情况。

资源不足

线程池必须设置合适的大小。线程消耗包括内存和其它系统资源在内的大量资源。除了 Thread 对象所需的内存之外,每个线程都需要两个可能很大的执行调用堆栈。除此以外,JVM 可能会为每个 Java 线程创建一个本机线程,这些本机线程将消耗额外的系统资源。最后,虽然线程之间切换的调度开销很小,但如果有很多线程,环境切换也可能严重地影响程序的性能。

线程泄露

当从线程池中去取一个线程以执行一项任务,而在任务完成后该线程却没有返回池时,会发生这种情况。发生线程泄漏的一种情形出现在任务抛出一个 RuntimeException 或一个 Error 时。如果池类没有捕捉到它们,那么线程只会退出而线程池的大小将会永久减少一个。当这种情况发生的次数足够多时,线程池最终就为空,而且系统将停止,因为没有可用的线程来处理任务。

使用原则

理解系统业务任务: 理解正在排队的任务以及它们正在做什么。
CPU密集型程序与I/O密集型程序的处理方式是不同的,为不同的任务类设置多个工作队列会很有意义,这要求开发人员按照业务场景去设置相对应的线程池。

不要对那些同步等待其它任务结果的任务排队: 可能会出现死锁。

正确处理操作时间长的线程: 程序需要等待其他线程的响应时,可以设置一个超时时间,释放线程

线程数计算

cpu密集型程序

cpu的计算占程序运行的很大一部分时间。
线程数量 = CPU 核数(逻辑)+ 1;

I/O密集型程序

最佳线程数 = (1/CPU利用率) = 1 + (I/O耗时/CPU耗时)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值