Android开发经验谈Android技术知识Android开发

Android 线程

2020-05-18  本文已影响0人  InFatuated

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

使用线程池的好处在于,是可以减少在创建和销毁线程上所花的时间,以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换“的问题,归纳总结就是:

Andorid中的线程池都是直接或间接通过配置ThreeadPoolExecutor来实现不同特性线程池。Android中最常见的类具有不同特性的线程池分别为:

通过源码可以了解到上面四种线程池实际还是利用ThreadPoolExecutor类实现的:


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

AsyncTask:底层封装了线程池和Handler,便于执行后台任务以及在子线程中进行UI操作。
HandlerThread:一种具有消息循环的线程,其内部可使用Handler
IntentService:是一种异步、会自动停止的服务,内部采用HandlerThread、

3、讲讲AsyncTask的原理

AsyncTask中有两个线程池(SerialExecutor
和THREAD_POOL_EXECUTOR)和一个Handler(InternalHandler),其中线程池SerialExecutor用于任务的排队,而线程池THREAD_POOL_EXECUTOR用于正真地执行任务,InternalHandler用于将执行环境从线程池切换到主线程。
SHandle是一个静态的Handler对象,为了能够将执行环境切换到主线程,这就要求sHandler这个对象必须在主线程创建。由于静态成员会在加载类的时候进行初始化,因此这就变相要求AsyncTask的类必须在主线程中加载,否则同一个进中的AsyncTask都将无法正常工作。

4、IntentService有什么用?

IntentService可用于执行后台耗时的任务,当任务执行完成后会自动停止,同时由于IntentService是服务的原因,不同于普通Service,IntentService可自动创建子线程来执行任务,这导致它的优先级比单纯的线程要高,不容易被系统杀死,所以IntentService比较适合执行一些高优先级的后台任务。

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

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

6、ThreadPollExecutor的工作策略?

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

7、Handler、Thred和HandlerThread的差别?

8、ThreadLocal的原理

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

当需要使用多线程时,有个变量恰巧不需要共享,此时就不必使用sychronzid这么麻烦的关键字来锁住,每个线程都相当于在堆内存中开辟一个空间,线程中带有对共享变量的缓冲区,通过缓冲区将堆内存中的共享变量进行读取和操作,ThreadLocal相当于线程内的内存,一个局部变量。每次可以对线程自身的数据读取和操作,并不需要通过缓冲区与主内存中的变量进行交互。并不会像synchronized那样修改主内存的数据,再将主内存的数据复制到线程内的工作内存。ThreadLocal可以让线程独占资源,存储于线程内部,避免线程堵塞造成CPU吞吐下降。

在每个Thread中包含一个ThreadLocalMap,ThreadLocalMap的key是ThreadLocal的对象,value是独享数据。

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

多线程的优点

多线程的缺点:

综合得出,多线程不一定能提高效率,在内存空间紧张的情况下反而是一种复旦,因此在日常反开发中,应尽量:

10、多线程中,让你做一个单例,你会怎么做

多线程中建立单例模式考虑的因素有很多,比如线程安全-延迟加载-代码安全:如防止序列化攻击,防止反射攻击()防止反射进行私有方法调用-性能因素
实现方法有多重,饿汉,懒汉(线程安全,现场非安全),多重检查(DCL),内部类,以及枚举


11、除了notify还有什么方式可以唤醒线程

12、什么事ANR?什么情况会出现ANR?如何避免?在不看代码的情况下如何快速定位出现ANR问题所在?

上一篇下一篇

猜你喜欢

热点阅读