线程
1、线程池的好处?四种线程池的使用场景,线程池的几个参数的理解?
参考回答:
o使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,
有可能造成系统创建大量同类线程而导致消耗完内存或则“过
度切换”的问题,归纳总结就是
▪重用存在的线程,减少对象创建、消亡的开销,性能
佳。
▪可有效控制最大并发线程数,提高系统资源的使用率,
同时避免过多资源竞争,避免堵塞。
▪提供定时执行、定期执行、单线程、并发数控制等功
能。
o Android中的线程池都是直接或间接通过配置
ThreadPoolExecutor来实现不同特性的线程池.Android中最
常见的类具有不同特性的线程池分别为:
▪newCachedThreadPool:只有非核心线程,最大线程
数非常大,所有线程都活动时会为新任务创建新线程,否
则会利用空闲线程( 60s空闲时间,过了就会被回收,所以
线程池中有0个线程的可能)来处理任务.
▪优点:任何任务都会被立即执行(任务队列
SynchronousQuue相当于一个空集合);比较适
合执行大量的耗时较少的任务.
▪newFixedThreadPool:只有核心线程,并且数量固定的,所有线程都活动时,因为队列没有限制大小,新任
务会等待执行,当线程池空闲时不会释放工作线程,还
会占用一定的系统资源。
▪优点:更快的响应外界请求
▪newScheduledThreadPool:核心线程数固定,非核心线程(闲着没活干会被立即回收数)没有限制.
▪优点:执行定时任务以及有固定周期的重复任务
▪newSingleThreadExecutor:只有一个核心线程,确保所有的任务都在同一线程中按序完成
▪优点:不需要处理线程同步的问题
o通过源码可以了解到上面的四种线程池实际上还是利用ThreadPoolExecutor 类实现的
2、Android中还了解哪些方便线程切换的类?
∙参考回答:
o AsyncTask:底层封装了线程池和Handler,便于执行后台任务以及在子线程中进行UI操作。
o HandlerThread:一种具有消息循环的线程,其内部可使用Handler。
o IntentService:是一种异步、会自动停止的服务,内部采用HandlerThread。
3、讲讲AsyncTask的原理
∙参考回答:
o AsyncTask中有两个线程池(SerialExecutor和
THREAD_POOL_EXECUTOR)和一个Handler
(InternalHandler),其中线程池SerialExecutor用于任务
的排队,而线程池THREAD_POOL_EXECUTOR用于真正地执
java单例模式懒汉和饿汉行任务,InternalHandler用于将执行环境从线程池切换到主
线程。
o sHandler是一个静态的Handler对象,为了能够将执行环境
切换到主线程,这就要求sHandler这个对象必须在主线程创
建。由于静态成员会在加载类的时候进行初始化,因此这就变
相要求AsyncTask的类必须在主线程中加载,否则同一个进程
中的AsyncTask都将无法正常工作。
4、IntentService有什么用?
∙参考回答:
o IntentService可用于执行后台耗时的任务,当任务执行完成后
会自动停止,同时由于IntentService是服务的原因,不同于普
通Service,IntentService可自动创建子线程来执行任务,这
导致它的优先级比单纯的线程要高,不容易被系统杀死,所以
IntentService比较适合执行一些高优先级的后台任务。
5、直接在Activity中创建一个thread跟在service中创建一个thread之间的区别?
∙参考回答:
o在Activity中被创建:该Thread的就是为这个Activity服务的,完成这个特定的Activity交代的任务,主动通知该Activity
一些消息和事件,Activity销毁后,该Thread也没有存活的意
义了。
o在Service中被创建:这是保证最长生命周期的Thread的唯一方式,只要整个Service不退出,Thread就可以一直在后台执
行,一般在Service的onCreate()中创建,在onDestroy()中
销毁。所以,在Service中创建的Thread,适合长期执行一些
独立于APP的后台任务,比较常见的就是:在Service中保持
与服务器端的长连接。
6、ThreadPoolExecutor的工作策略?
参考回答:ThreadPoolExecutor执行任务时会遵循如下规则
o如果线程池中的线程数量未达到核心线程的数量,那么会直接启动一个核心线程来执行任务。
o如果线程池中的线程数量已经达到或则超过核心线程的数量,那么任务会被插入任务队列中排队等待执行。
o如果在第2点无法将任务插入到任务队列中,这往往是由于任务队列已满,这个时候如果在线程数量未达到线程池规定的最
大值,那么会立刻启动一个非核心线程来执行任务。
o如果第3点中线程数量已经达到线程池规定的最大值,那么就拒绝执行此任务,ThreadPoolExecutor会调用
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论