Java线程池

Java的线程池

java中的线程池是运用场景最多的并发框架,集合所有需要异步和并发执行任务的程序都可以使用线程池。

线程池带来的好处

1.降低了资源的消耗: 在线程池中直接拿创建好的线程降低了直接创建和销毁线程造成的消耗,开销也降低了。
2.提高相应速度: 任务不需要等到线程创建就可以立即执行。
3.提高线程的可管理性: 无限制地创建线程,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配,调优和监控。

线程池的实现原理

当提交一个新任务到线程池的时候,大致流程如下:
1)先判断线程核心线程池里的线程是否都在执行任务?
a.如果不是,则创建一个新的工作线程来执行任务。
b.如果是,进入下个流程。
2)再判断线程池工作队列是否满?
a.如果没满,则将新提交的任务放入线程池的工作队列中。
b.如果满了,进入下个流程。
3)再判断线程池的线程是否都处于工作状态?
a.如果没有,则创建一个新的工作线程来执行任务。
b.如果已经满了,则交给饱和策略来处理这个任务。

如图,ThreadPoolExecutor执行execute()方法流程图
在这里插入图片描述
在这里插入图片描述

线程池的创建

1.我们可以用ThreadPoolExecutor来创建一个线程池,这个构造方法包含了6个参数,所以不推荐使用。
2.我们可以使用Executors类的静态方法newCachedThreadPool()完成线程池的构建。

向线程池提交任务

可以使用两个方法向线程池提交任务,分别为execute()和submit()方法。
区别: execute()方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功。submit()方法用于提交需要返回值的任务。线程池会返回一个对象,通过这个对象可以判断任务是否执行成功,并且可以通过get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成。

关闭线程池

可以通过调用线程池的shutdown或shutdownNow方法来关闭线程。原理是遍历线程池的工作线程。然后逐个人调用线程的interrupt方法来中断线程 ,所以无法响应中断的任务可能永远无法终止。
区别: shutdowNow是先将线程池的状态设置为STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而shutdow只是将线程状态设置为SHUTDOWN状态,然后中断所有没有正在执行任务的线程。

合理配置线程池

可以从以下几个方面分析:
1.任务的性质: CPU密集型任务,IO密集型任务和混合性任务。
2.任务的优先级: 高,中和低。
3.任务的执行时间: 长,中和短。
4.任务的依懒性: 是否依赖其他系统资源,如数据库链接等。
1.CPU密集型任务应该配置尽可能小的线程(如N+1个线程的线程池)。由于IO密集任务线程并不是一直在执行任务,所以可配置尽可能多的线程(如2N个线程的线程池)。混合型任务,可以拆分,并且只要两个拆分后的任务执行时间差不大,那么执行的吞吐量将高于串行的吞吐量。如果差的时间太大,则没必要分解。
2.优先级不同的任务可以使用优先级阻塞队列来处理,它可以让优先级高的任务先执行。(**注意:**如果一直有优先级高的任务入队,那么优先级低的任务可能永远都不能执行)。
3.执行不同时间的任务可以交给不同规模的线程池来处理,或者可以使用优先级队列,让时间短的任务先执行。
4.依赖数据库链接池的任务,因为线程提交SQL后需要等待数据库返回结果,等待的时间越长,CPU空闲的时间就越长,所以线程数可以配置的少点,这样可以实现CPU最大的利用化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值