android面试-Android的线程和线程池

前言:

这一部分参考Android开发艺术探索的总结,所以最好有一本书来看,里面的内容会详细很多

线程与服务的区别:

如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。 

AsyncTask:

     采用Thread与Handler,但不适合特别耗时的任务。

     四个主要方法:onPreExecute()、doInBackground()、onProgressUpdate()、onPostExecute()、onCancelled()被调用时onPostExecute不会调用

     从execute()开始会先进行onPreExecute,AsyncTask是通过两个线程池、一个Handler进行操作。串行线程池通过ArrayDeque进行线程任务排队,另一个线程池进行任务的执行doInBackground。Handler主要是进行onProgressUpdate、onPostExecute(会有进行取消的判断,如果取消了,就不会进行onPostExecute的操作)

     Handler是一个静态的对象,能够将执行环境切换到主线程中,静态成员在进行加在类的时候会初始化,因此需要将AsyncTask在主线程中加载。

     串行:Android4.1之后是默认串行,如果想要并行的话,需要一个、executeOnExecutor方法进行并行的处理

HandlerThread:

     采用Handler与Thread的结合,主要是对于Handler机制的理解。

IntentService:

     基于HandlerThread进行操作,通过onStart里面的Handler发送消息Intent,即启动Intent服务时的Intent,由于Handler是按顺序进行操作的,所以进行耗时操作的时候也是按照顺序的,onStopself(startId)来判断是否已经运行完,否则等待所有服务进行完才结束。

线程池:

     线程池可以重用线程,避免因为线程的重用、销毁所带来的性能开销
     能控制线程池的最大并发数,避免资源争夺导致的阻塞
     ThreadPoolExecutor:核心线程数、最大线程数、超时时间、

线程池分类:

      FiexedThreadPool:只有核心线程
      CachedThreadPool:只有非核心线程
      ScheduledThreadPool:核心线程固定,非核心没有限制,非核心闲置时会被立即回收
      SingleThreadPool:只有一个核心线程,确保顺序执行(这个在面试深信服的时候,面试过问过A、B、C如何保证顺序执行

猜你喜欢

转载自blog.csdn.net/wzhworld/article/details/78337554