
Android线程优化--总体
发布日期:2021-05-06 19:10:15
浏览次数:26
分类:技术文章
本文共 2124 字,大约阅读时间需要 7 分钟。
线程优化
线程调度
(1)分时调度:轮流获取,均匀CPU时间
(2)抢占式调度:优先级高的获取,jvm采用
Android线程调度
(1)nice值
Process类中定义,
值越小,优先级越高
默认是THREAD_PRIORITY_DEFAULT,0
(2)cgroup (如果由1个高优先级,10个低优先级的线程,这是就需要cgroup了)
更严格的群组调度策略
保证前台线程可以获取到更多的CPU
异步方式
(1)Thread
(2)HandlerThread
(3)IntentService
(4)AsyncTask
(5)线程池
(6)RXJava
线程优化实战
线程使用准则
(1)严禁直接 new Thread
(2)提供基础的线程池供各个业务线使用
避免各个业务线各自维护一套线程池,导致线程数过多
(3)根据任务类型选择合适的异步方式
优先级低,长时间执行,HandleThread
(4)创建线程必须命名
方便定位线程归属
运行期Thread.currentThread().setName 修改线程名字
(5)关键异步任务监控
异步不等于不耗时
AOP的方式做监控
(6)重视优先级设置
Process.setThreadPriority();
可以设置多次
如何锁定线程创建者
// hook线程,对应视频的7-5节 DexposedBridge.hookAllConstructors(Thread.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); Thread thread = (Thread) param.thisObject; LogUtils.i(thread.getName()+" stack "+Log.getStackTraceString(new Throwable())); } });
线程收敛优雅实践
public class ThreadPoolUtils { private int CPUCOUNT = Runtime.getRuntime().availableProcessors(); private ThreadPoolExecutor cpuExecutor = new ThreadPoolExecutor(CPUCOUNT, CPUCOUNT, 30, TimeUnit.SECONDS, new LinkedBlockingDeque(), sThreadFactory); private ThreadPoolExecutor iOExecutor = new ThreadPoolExecutor(64, 64, 30, TimeUnit.SECONDS, new LinkedBlockingDeque (), sThreadFactory); private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); public Thread newThread(Runnable r) { return new Thread(r, "ThreadPoolUtils #" + mCount.getAndIncrement()); } }; public static ExecutorService getService() { return sService; } private static ExecutorService sService = Executors.newFixedThreadPool(5, new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r, "ThreadPoolUtils"); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); return thread; } });}
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月07日 17时13分10秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
深入理解 ZK集群的Leader选举
2019-03-06
计算机的运算方法
2019-03-06
谈谈MySQL的基数统计
2019-03-06
大型面试现场:一条update sql执行都经历什么?
2019-03-06
自导自演的面试现场之--你竟然不了解MySQL的组提交?
2019-03-06
ajax 处理请求回来的数据
2019-03-06
简单单页面路由跳转demo
2019-03-06
vue 不常见操作
2019-03-06
jQuery的事件绑定与触发 - 学习笔记
2019-03-06
解决页面加载闪白问题-背景图片加载优化
2019-03-06
Python处理接口测试的签名
2019-03-06
测试流程规范--测试报告模板
2019-03-06
测试流程规范--提测规范(钉钉、邮件)
2019-03-06
Linux上TCP的几个内核参数调优
2019-03-06
解Bug之路-dubbo流量上线时的非平滑问题
2019-03-06
记一次讲故事机器人的开发-我有故事,让机器人来读
2019-03-06
从Linux源码看Socket(TCP)的listen及连接队列
2019-03-06
高德网络定位算法的演进
2019-03-06
高德算法工程一体化实践和思考
2019-03-06
为亿级用户的美好出行而战!高德地图首届算法大赛落幕 95后北邮在读博士带队夺冠
2019-03-06