Android线程与线程池面试题总结

目录

一、线程基础1.1 进程 vs 线程:1.2线程的生命周期/状态1.3 创建线程的方式:1.4 线程安全:
二、Android中的线程模型与机制2.1 主线程/UI线程:2.2 Handler、Looper、Message、Message Queue:2.3 AsyncTask(已废弃,但面试常问):2.4 IntentService (已废弃):
三、线程池(java.util.concurrent)3.1 为什么需要线程池?3.2 ThreadPoolExecutor核心参数:3.3 常见的线程池类型(Executors工厂方法):3.4 如何合理配置线程池参数?3.5 线程池的关闭:3.6 Future和FutureTask:
四、高级话题与最佳实现4.1 Android中的后台任务最佳实践:4.2 协程 vs. 传统线程/线程池:4.3 并发工具类:4.4 常见误区:
面试建议

这里总结一份Android开发中关于线程和线程池的核心面试题,涵盖了基本概念、Android特有机制、线程池使用以及常见问题:

一、线程基础

1.1 进程 vs 线程:

两者的根本区别是什么?(资源分配、执行单位)为什么在Android中需要多线程?(避免阻塞主线程/UI线程)
详细解答

1.2线程的生命周期/状态

列举Java线程的几种状态(New,Runnable,Blocked,Waiting,Timed Waiting,Terminated)。解释wait(),notify(),notifyAll()的作用以及它们与锁(sychronized)的关系?这些方法在那些对象上调用?
上述问题简单总结

1.3 创建线程的方式:

继承Thread类和实现Runnable借口的区别?(单继承限制、资源共享)为什么更推荐实现Runnable接口?Callable和Future的作用是什么?与Runnable的区别?(返回值、异常抛出)

1.4 线程安全:

什么是线程安全?为什么需要关注?实现线程安全的常用方法?(sychronized关键字、ReentrantLock,volatile,原子类和AtomicInteger,不可变对象)synchronized关键字的用法(修饰方法、代码块)?锁对象是什么?volatile关键字的作用?(保证可见性、禁止指令重排,不保证原子性)解释ReentrantLock与synchronized的区别?(可中断,公平锁,尝试获取锁、条件变量)什么是死锁?如何避免?(避免嵌套锁、顺序加锁、超时机制)

二、Android中的线程模型与机制

2.1 主线程/UI线程:

为什么Android规定UI操作必须在主线程进行?在自线程更新UI会导致什么问题?(CalledFromWrongThreadException)什么是ANR(Application Not Responding)?常见出发原因?(主线程阻塞:网络IO、复杂计算、同步锁等待)

2.2 Handler、Looper、Message、Message Queue:

解释Android的消息机制(Handler-Looper-MessageQueue)是如何工作的?Looper的作用是什么?一个线程可以有多个Looper吗?主线程的Looper是如何创建的?MessageQueue是什么?它如何存储和处理消息?Handler的作用是什么?如何创建绑定到特定线程Looper的Handler?sendMessage()和post(Runnable)的区别?如何避免Handler引起的内存泄漏?(使用静态内部类+弱引用WeakReference,在onDestroy()中移除Callbacks and Message)HandlerThread是什么?它解决什么问题?(自带Looper的后台线程)

2.3 AsyncTask(已废弃,但面试常问):

AsyncTask的设计初衷是什么?它的生命周期方法(onPreExecute, doInBackground, onProgressUpdate, onPostExecute)分别在哪个线程执行?AsyncTask的缺点和局限性?(生命周期问题、内存泄漏风险、串行执行默认行为、配置变更问题、平台版本差异)为什么Google废弃了AsyncTask?推荐替代方案是什么?(java.util.concurrent, LiveData, ViewModel, Kotlin协程)

2.4 IntentService (已废弃):

IntentService的特点?(后台工作线程、串行执行、自动停止)与普通Service+线程的区别?为什么被废弃?替代方案?(JobIntentService -> 现在更推荐WorkManager)

三、线程池(java.util.concurrent)

3.1 为什么需要线程池?

直接创建线程的缺点?(资源消耗大、创建销毁开销大、管理困难)线程池的优势?(资源复用、控制并发数、管理任务队列、提供监控)

3.2 ThreadPoolExecutor核心参数:

详细解释ThreadPoolExecutor的7个核心构造参数:
corePoolSize(核心线程数)
maximumPoolSize (最大线程数)
keepAliveTime (非核心线程空闲存活时间)
unit (时间单位)
workQueue (任务队列 )
BlockingQueue)
threadFactory (线程工厂)
rejectedExecutionHandler (拒绝策略 – AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy, DiscardPolicy)线程池创建新线程的流程是怎样的?(核心线程 -> 入队列 -> 非核心线程 -> 拒绝策略)

3.3 常见的线程池类型(Executors工厂方法):

newFixedThreadPool(int nThreads): 特点?(固定大小线程池,无界队列)适用场景?风险?newCachedThreadPool(): 特点?(可扩容线程池,SynchronousQueue)适用场景?风险?newSingleThreadExecutor(): 特点?(单线程,无界队列)适用场景?newScheduledThreadPool(int corePoolSize): 特点?(支持定时/周期性任务)为什么阿里Java规约不建议直接使用Executors创建线程池? (风险:FixedThreadPool/SingleThreadExecutor使用无界队列LinkedBlockingQueue可能OOM;CachedThreadPool最大线程数Integer.MAX_VALUE可能OOM)

3.4 如何合理配置线程池参数?

考虑因素?(任务类型:CPU密集型、IO密集型、混合型;系统资源;任务优先级;执行时间;依赖关系)经验公式?(CPU密集型:corePoolSize = CPU核心数 + 1;IO密集型:corePoolSize = 2 * CPU核心数,但这只是起点,需压测调整)

3.5 线程池的关闭:

shutdown()和shutdownNow()的区别?(是否中断正在执行的任务、是否处理队列任务)如何优雅关闭线程池并等待任务完成?(awaitTermination)

3.6 Future和FutureTask:

如何通过线程池提交Callable任务并获取结果?(submit(Callable)返回Future)Future.get()的作用?(阻塞获取结果/异常)Future。cancle(boolean mayInterruptIfRunning)的作用?

四、高级话题与最佳实现

4.1 Android中的后台任务最佳实践:

ViewModel + LiveData + Repository(结合线程池/协程)Kotlin协程(CoroutineScope,Dispatchers,suspend,launch,async/await)WorkManager(处理需持久化、约束条件下执行的后台任务)JobScheduler(API 21+,更精细的条件调度)

4.2 协程 vs. 传统线程/线程池:

协程的优势?(轻量级、结构化并发、简化异步代码、挂起恢复机制)协程在Android上的主要调度器(Dispatchers.Main, Dispatchers.IO,Dispatchers.Default)?

4.3 并发工具类:

CountDownLatch(等待多个任务完成)CyclicBarrier(线程到达屏障点等待)Semaphore(控制并发访问资源数)了解其基本用途。

4.4 常见误区:

认为volatile能保证原子性在子线程直接更新UI滥用new Thread().start().使用Executors创建FixedThreadPool/SingleThreadExecutor/CachedThreadPool而不考虑OOM风险。AsyscTask或Handler导致内存泄漏。对线程池参数配置不合理。

面试建议

理解原理 :不仅要回答是什么,更要理解为什么(比如Handler机制的原理,线程池工作流程)结合实际: 能说出什么场景下该用什么技术(比如轻量后台用线程池/协程,持久化任务用WorkManager)。关注演进: 知道旧方案(AsyncTask,IntentService)的问题和新方案(协程,WorkManager)的优势。动手实践:对关键概念(HandlerThread,自定义线程池,协程)要有代码实践。清晰表达:条理清晰的阐述复杂概念(如线程池创建流程,Handler消息循环)。
这份总结涵盖了Android线程和线程池面试的核心知识带你。深入理解这些概念并能够清晰表达,将大大提升你在Android面试中的表现。祝你面试顺利。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容