多线程的使用非常广泛,多线程带来的效率和诸多好处也不言而喻,但是多线程使用不当也会带来诸多问题,根据自己学习和同事讲解说下多线程使用不当带来的问题和优化。

多线程带来的问题

  1. 浪费内存。每个线程占用内存至少64KB,因此,线程过多,会浪费内存。
  2. 浪费CPU。线程过多,CPU需要频繁进行切换操作,会导致严重的性能下降。
  3. 拖慢主线程。如果子线程的优先级都和主线程一样高,主线程就得不到更多资源优先执行。

Android系统提供的线程方法

  • AsyncTask: 为UI线程与工作线程之间进行快速的切换提供一种简单便捷的机制。适用于当下立即需要启动,但是异步执行的生命周期短暂的使用场景。
  • HandlerThread: 为某些回调方法或者等待某些任务的执行设置一个专属的线程,并提供线程任务的调度机制。HandlerThread组合了Handler,MessageQueue,Looper,实现了一个长时间运行的线程不断的从队列中获取任务进行执行的功能。
  • ThreadPool: 把任务分解成不同的单元,分发到各个不同的线程上,进行同时并发处理。
  • IntentService: 适合于执行由UI触发的后台Service任务,并可以把后台任务执行的情况通过一定的机制反馈给UI。

调整线程优先级API

说明:值越低优先级越高,值越高优先级越低,如果不设置优先级,默认都是0。所以在编码的过程中可以通过项目中业务的需求来相应的提高或降低线程的优先级。

参数范围从-20到24

Android API:android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

THREAD_PRIORITY_DEFAULT,默认的线程优先级,值为0。

THREAD_PRIORITY_LOWEST,最低的线程级别,值为19。

THREAD_PRIORITY_BACKGROUND 后台线程建议设置这个优先级,值为10

THREAD_PRIORITY_FOREGROUND 用户正在交互的UI线程,代码中无法设置该优先级,系统会按照情况调整到该优先级,值为-2。

THREAD_PRIORITY_DISPLAY 也是与UI交互相关的优先级界别,但是要比THREAD_PRIORITY_FOREGROUND优先,代码中无法设置,由系统按照情况调整,值为-4。

THREAD_PRIORITY_URGENT_DISPLAY 显示线程的最高级别,用来处理绘制画面和检索输入事件,代码中无法设置成该优先级。值为-8。

THREAD_PRIORITY_AUDIO 声音线程的标准级别,代码中无法设置为该优先级,值为 -16。

THREAD_PRIORITY_URGENT_AUDIO 声音线程的最高级别,优先程度较THREAD_PRIORITY_AUDIO要高。代码中无法设置为该优先级。值为-19。

THREAD_PRIORITY_MORE_FAVORABLE 相对THREAD_PRIORITY_DEFAULT稍微优先,值为-1。

THREAD_PRIORITY_LESS_FAVORABLE 相对THREAD_PRIORITY_DEFAULT稍微落后一些,值为1。

 

Java API:xxxThreadObject.setPriority(MAX_PRIORITY);

Java为Thread提供了三个级别的设置:

MAX_PRIORITY,相当于android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY,值为10。

MIN_PRIORITY,相当于android.os.Process.THREAD_PRIORITY_LOWEST,值为0。

NORM_PRIORITY,相当于android.os.Process.THREAD_PRIORITY_DEFAULT,值为5。

使用setPriority我们可以为某个线程设置优先级,使用getPriority可以获得某个线程的优先级。

在Android系统中,不建议使用Java原生的API,因为Android提供的API划分的级别更多,更适合在Android系统中进行设定细致的优先级。默认情况下,新创建的线程的优先级默认和创建它的母线程保持一致。如果主UI线程创建出了几十个工作线程,这些工作线程的优先级就默认和主线程保持一致了,为了不让新创建的工作线程和主线程抢占CPU资源,需要把这些线程的优先级进行降低处理,这样才能给帮组CPU识别主次,提高主线程所能得到的系统资源。

 

参考:

Google课程学习笔记 - Android性能优化典范 - 5

http://hukai.me/android-performance-patterns-season-5/

剖析Android中进程与线程调度之nice

https://droidyue.com/blog/2015/09/05/android-process-and-thread-schedule-nice/