7.1线程调度原理
如果是只是根据nice值的话,那么太多后台线程会抢占了前台线程
- 工作量越大,优先级应该越低
- 线程A中创建线程B,B跟A的线程优先级一样
7.2Android异步方式汇总
- Thread
- 不易复用,频繁创建及销毁开销大
- 复杂场景不易使用
- HandlerThread(自带消息循环的线程)
- 串行执行
- 适合长时间运行,不断从队列中获取服务的场景
- IntentService(继承自Service在内部创建HandlerThread)
- 异步,不占用主线程
- 优先级较高(继承Service),不易被系统Kill
- AsyncTask
- 无需自己处理线程切换
- 需要注意版本不一致问题
线程池
线程使用准则
- 严禁使用new Thread
- 创建线程必须命名,方便定位
- 可以在运行期Thread.curremtThread().setName修改名字
- 可以在运行期Thread.curremtThread().setName修改名字
- 优先级低,长时间执行,HandlerThread
https://github.com/codeguyFred/MyPerformance/blob/master/app/src/main/java/com/optimize/performance/async/ThreadPoolUtils.java
锁定线程创建者
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()));
}
});
- iOExecutor和cpuExecutor
通过不同类型get不同的Executor去执行