java并发编程-线程池(一)Executor框架

如果觉得写的还可以请关注微信公众号:程序猿的日常分享,定期更新分享。

为什么需要线程池

在java中,使用线程来执行异步任务。java线程的创建与销毁需要一定的开销。如果每个任务都创建一个线程会带来哪些问题:

1、如果我们为每一个任务都创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源。同时,为每一个任务创建一个新线程来执行,这种策略可能会使处于高负荷状态的应用最终崩溃。

2、过多的线程会占用过多的内存等资源,还会带来过多的上下文切换,同时还会导致系统不稳定。

线程池解决问题思路

针对上面的两点问题,线程池有两个解决思路。
首先,针对反复创建线程开销大的问题,线程池用一些固定的线程一直保持工作状态并反复执行任务。

其次,针对过多线程占用太多内存资源的问题,解决思路更直接,线程池会根据需要创建线程,控制线程的总数量,避免占用过多内存资源。

使用线程池的好处

使用线程池比手动创建线程主要有三点好处。

1、线程池可以解决线程生命周期的系统开销问题,同时还可以加快响应速度。因为线程池中的线程是可以复用的,我们只用少量的线程去执行大量的任务,这就大大减小了线程生命周期的开销。而且线程通常不是等接到任务后再临时创建,而是已经创建好时刻准备执行任务,这样就消除了线程创建所带来的延迟,提升了响应速度,增强了用户体验。
2、线程池可以统筹内存和 CPU 的使用,避免资源使用不当。线程池会根据配置和任务数量灵活地控制线程数量,不够的时候就创建,太多的时候就回收,避免线程过多导致内存溢出,或线程太少导致 CPU 资源浪费,达到了一个完美的平衡。
3、线程池可以统一管理资源。比如线程池可以统一管理任务队列和线程,可以统一开始或结束任务,比单个线程逐一处理任务要更方便、更易于管理,同时也有利于数据统计,比如我们可以很方便地统计出已经执行过的任务的数量。

Executor框架

我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等。线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从JDK1.5开始,为了把工作单元与执行机制分离开,Executor框架诞生了,他是一个用于统一创建与运行的接口。Executor框架实现的就是线程池的功能。

Executor框架的两级调度模型

在上层,java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器将这些任务映射为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上。这种两级调度模型如下:

Executor框架的主要成员

1、ThreadPoolExecutor 用于创建立即执行的线程池。
2、ScheduledThreadPoolExecutor 用于创建执行定时任务类线程池。
3、Future接口和实现类FutureTask用来表示异步任务的结果,当我们通过Runnable或Callable的实现类提交任务时,ThreadPoolExecutor或ScheduledThreadPoolExecutor会返回一个FutureTask对象。
4、Runnable接口 实现该接口的线程不会返回结果。
5、Callable接口 实现该接口的线程会返回结果。提交任务后会线程池会返回一个FutureTask对象。
6、Executors 主要用于提供线程池相关的操作,提供了一系列工厂方法用于创建线程池。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值