android 如何阻塞线程池,android 多线程 — 线程池线程数配置

ps:原谅我没干过后台开发,不了解线程池配置的更多内容,先写这么点

a27416b7f01f

好像要一个呀 ~

在《java虚拟机并发编程》一书中推荐我们使用系统可用的处理器核心数来匹配线程池数量

Runtime.getRuntime().availableProcessors()

常见2种任务:

计算密集型 - 创建处理器可用核心数那么多的线程数就可以了,在这种情况下,创建更多的线程对程序的性能而言反而是不利的,因为当有多个任务处于就绪状态时,处理器核心需要在线程间频繁进行上下文切换,而这种切换对程序性能损耗较大。

IO密集型 - 那么我们需要开更多的线程来提高性能,执行 IO 操作线程会被阻塞,处理器可以立即进行上下文切换以便处理其他就绪线程,如果我们只有处理器可用核心数那么多线程的话,则即使有待执行的任务也无法处理,因为我们已经拿不出更多的线程供处理器调度了

那么如何区别计算密集型和IO密集型任务呢,这就要提到一个概念:阻塞系数

阻塞系数 = 阻塞时间 / 总的运行时间,如果任务有 50% 的时间处于阻塞状态,则阻塞系数为0.5

如果任务被阻塞的时间 < 50%,任务就是计算密集型的,所需线程数将随之减少,但最少也不应该低于处理器的核心数。如果任务被阻塞的时间大于执行时间,即该任务是 IO 密集型的,我们就需要创建比处理器核心数大几倍数量的线程

网上有个公式:

线程数 = CPU可用核心数/(1 - 阻塞系数),其中阻塞系数的取值在0和1之间。

我们可以通过扩展线程池进行监控,继承线程池并重写线程池 beforeExecute、afterExecute、terminated方法,我们可以在任务执行前,执行后和线程池关闭前干一些事情。如监控任务的平均执行时间,最大执行时间和最小执行时间等,这几个方法在线程池里是空方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值