@Android程序员:这 5 道刁钻的线程相关题,你会几道?
今天我们一起来看五道线程相关的面试题,相信看完之后面试官再问到相关的问题,你就能胸有成竹了。
1. 直接在Activity中创建一个thread跟在service中创建一个thread之间的区别?
-
在Activity中被创建:该Thread的就是为这个Activity服务的,完成这个特定的Activity交代的任务,主动通知该Activity一些消息和事件,==Activity销毁后,该Thread也没有存活的意义了。==
-
在Service中被创建:这是保证最长生命周期的Thread的唯一方式,==只要整个Service不退出,Thread就可以一直在后台执行==,一般在Service的onCreate()中创建,在onDestroy()中销毁。所以,在Service中创建的Thread,适合长期执行一些独立于APP的后台任务,比较常见的就是:在Service中保持与服务器端的长连接。
2.IntentService有什么用 ?
IntentService 是 Service 的子类,是一个异步的,会自动停止的服务,很好解决了传统的 Service 中处理完耗时操作忘记停止并销毁 Service 的问题,生成一个默认的且与线程相互独立的工作线程执行所有发送到onStartCommand()方法的 Intent,可以在 onHandleIntent()中处理. 串行队列,每次只运行一个任务,不存在线程安全问题,所有任务执行完后自动停止服务,不需要自己手动调用 stopSelf()来停止
3.除了notify还有什么方式可以唤醒线程?
-
当一个拥有Object锁的线程调用 wait()方法时,就会使当前线程加入object.wait 等待队列中,并且释放当前占用的Object锁,这样其他线程就有机会获取这个Object锁,获得Object锁的线程调用notify()方法,就能在Object.wait 等待队列中随机唤醒一个线程(该唤醒是随机的与加入的顺序无关,优先级高的被唤醒概率会高)
-
如果调用notifyAll()方法就唤醒全部的线程。注意:调用notify()方法后并不会立即释放object锁,会等待该线程执行完毕后释放Object锁。
4.线程池中的几个参数是什么意思,线程池的种类有哪些?
线程池的构造函数如下:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);}
参数解释如下:
· corePoolSize:核心线程数量,不会释放。
· maximumPoolSize:允许使用的最大线程池数量,非核心线程数量,闲置时会释放。
· keepAliveTime:闲置线程允许的最大闲置时间。
· unit:闲置时间的单位。
· workQueue:阻塞队列,不同的阻塞队列有不同的特性。
线程池分为四个类型:
· CachedThreadPool:闲置线程超时会释放,没有闲置线程的情况下,每次都会创建新的线程。
· FixedThreadPool:线程池只能存放指定数量的线程池,线程不会释放,可重复利用。
· SingleThreadExecutor:单线程的线程池。
· ScheduledThreadPool:可定时和重复执行的线程池。
5.Handler、Thread和HandlerThread的差别?
-
Handler:在android中负责发送和处理消息,通过它可以实现其他支线线程与主线程之间的消息通讯。
-
Thread:Java进程中执行运算的最小单位,亦即执行处理机调度的基本单位。某一进程中一路单独运行的程序。
-
HandlerThread:一个继承自Thread的类HandlerThread,Android中没有对Java中的Thread进行任何封装,而是提供了一个继承自Thread的类HandlerThread类,这个类对Java的Thread做了很多便利的封装。==HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它在内部直接实现了Looper的实现,这是Handler消息机制必不可少的。有了自己的looper,可以让我们在自己的线程中分发和处理消息==。如果不用HandlerThread的话,需要手动去调用Looper.prepare()和Looper.loop()这些方法。
总结
线程相关的知识很重要,这也是面试常问的原因。
最后在这里我也分享一份大佬自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅并给下属员工学习的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。
总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
最近面试被怼了?缺面试题刷提升自己吗?
点击:
来获取学习资料提升自己去挑战一下BAT面试难关吧
你有遇到过什么刁钻的面试题吗,欢迎留言分享~