Android线程相关

2020-04-16  本文已影响0人  Vinson武

==进程和线程==

区别

线程池的好处? 四种线程池的使用场景,线程池的几个参数的理解?

  1. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
  2. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
  3. 提供定时执行、定期执行、单线程、并发数控制等功能。
  1. ==newCachedThreadPool==:只有非核心线程,最大线程数非常大,所有线程都活动时会为新任务创建新线程,否则会利用空闲线程 (60s空闲时间,过了就会被回收,所以线程池中有0个线程的可能 )来处理任务.

优点:任何任务都会被立即执行(任务队列SynchronousQuue相当于一个空集合);比较适合执行大量的耗时较少的任务.

  1. ==newFixedThreadPool==:只有核心线程,并且数量固定的,所有线程都活动时,因为队列没有限制大小,新任务会等待执行,当线程池空闲时不会释放工作线程,还会占用一定的系统资源。

优点:更快的响应外界请求

  1. ==newScheduledThreadPool==:核心线程数固定,非核心线程(闲着没活干会被立即回收数)没有限制.

优点:执行定时任务以及有固定周期的重复任务

  1. ==newSingleThreadExecutor==:只有一个核心线程,确保所有的任务都在同一线程中按序完成

优点:不需要处理线程同步的问题

ThreadPoolExecutor的工作策略 ?

ThreadPoolExecutor执行任务时会遵循如下规则

  1. 如果线程池中的线程数量未达到核心线程的数量,那么会直接启动一个核心线程来执行任务。
  2. 如果线程池中的线程数量已经达到或则超过核心线程的数量,那么任务会被插入任务队列中排队等待执行。
  3. 如果在第2点无法将任务插入到任务队列中,这往往是由于任务队列已满,这个时候如果在线程数量未达到线程池规定的最大值,那么会立刻启动一个非核心线程来执行任务。
  4. 如果第3点中线程数量已经达到线程池规定的最大值,那么就拒绝执行此任务,ThreadPoolExecutor会调用RejectedExecutionHandler的rejectedExecution方法来通知调用者。

Android中还了解哪些方便线程切换的类?

AsyncTask的原理和问题

原理:

问题:

IntentService有什么用 ?

直接在Activity中创建一个thread跟在service中创建一个thread之间的区别?

在Activity中被创建:该Thread的就是为这个Activity服务的,完成这个特定的Activity交代的任务,主动通知该Activity一些消息和事件,==Activity销毁后,该Thread也没有存活的意义了。==
在Service中被创建:这是保证最长生命周期的Thread的唯一方式,==只要整个Service不退出,Thread就可以一直在后台执行==,一般在Service的onCreate()中创建,在onDestroy()中销毁。所以,在Service中创建的Thread,适合长期执行一些独立于APP的后台任务,比较常见的就是:在Service中保持与服务器端的长连接。

Handler、Thread和HandlerThread的差别?

ThreadLocal的原理

==ThreadLocal是一个关于创建线程局部变量的类==。使用场景如下所示:

多线程是否一定会高效(优缺点)

  1. 方便高效的内存共享——多进程下内存共享比较不便,且会抵消掉多进程编程的好处
  2. 较轻的上下文切换开销不用切换地址空间,不用更改CR3寄存器,不用清空TLB
  3. 线程上的任务执行完后自动销毁
  1. 开启线程需要占用一定的内存空间(默认情况下,每一个线程都占512KB)
  2. 如果开启大量的线程,会占用大量的内存空间,降低程序的性能
  3. 线程越多,cpu在调用线程上的开销就越大
    程序设计更加复杂,比如线程间的通信、多线程的数据共享。
  1. 不要频繁创建,销毁线程,使用线程池
  2. 减少线程间同步和通信(最为关键)
  3. 避免需要频繁共享写的数据
  4. 合理安排共享数据结构,避免伪共享(false sharing)
  5. 使用非阻塞数据结构/算法
  6. 避免可能产生可伸缩性问题的系统调用(比如mmap)
  7. 避免产生大量缺页异常,尽量使用Huge Page
  8. 可以的话使用用户态轻量级线程代替内核线程

参考链接

上一篇 下一篇

猜你喜欢

热点阅读