一、核心概念解析
1. 基本定义
生产者消费者模型是一种多线程协作模式,包含两个核心角色:
-
生产者:生成数据/任务的线程
-
消费者:处理数据/任务的线程
2. 核心价值
graph LR
A[解耦] --> B[生产与消费逻辑分离]
C[缓冲] --> D[平衡处理速度差异]
E[并发] --> F[提高系统吞吐量]
二、Android中的实现方案
1. HandlerThread方案(经典实现)
适用场景:需要与UI线程通信的后台任务
// 初始化消费者线程
val handlerThread = HandlerThread("Consumer").apply { start() }
// 创建带Looper的Handler
val handler = Handler(handlerThread.looper) { msg ->
when(msg.what) {
MSG_PROCESS -> {
val data = msg.obj as Data
// 处理数据...
true // 消息已处理
}
else -> false
}
}
// 生产者发送消息
fun produce(data: Data) {
handler.sendMessage(
handler.obtainMessage(MSG_PROCESS, data)
)
}
// 实际案例:IntentService的底层实现
2. BlockingQueue方案(推荐方案)
适用场景:数据密集型处理
// 创建有界队列(防止OOM)
private val queue = ArrayBlockingQueue<Data>(100)
// 生产者线程
Thread {
while (isActive) {
val data = generateData()
queue.put(data) // 队列满时自动阻塞
}
}.start()
// 消费者线程池
private val executor = Executors.newFixedThreadPool(4)
fun startConsumer() {
executor.execute {
while (true) {
val data = queue.take() // 队列空时阻塞
processData(data)
}
}
}
// 实际案例:Glide图片加载的任务队列
三、Android特有优化策略
1. 生命周期感知
class SafeProducer(
lifecycle: Lifecycle,
private val queue: BlockingQueue<Data>
) : LifecycleObserver {
private var isActive = false
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun activate() {
isActive = true
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun deactivate() {
isActive = false
queue.clear() // 避免内存泄漏
}
}
// 在Activity/Fragment中
lifecycle.addObserver(SafeProducer(lifecycle, queue))
2. 跨进程通信方案
<!-- AndroidManifest.xml -->
<service android:name=".ProducerService"
android:process=":producer"/>
// 使用Messenger跨进程通信
class ProducerService extends Service {
private final Messenger messenger = new Messenger(
new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
// 接收消费请求
}
}
);
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
}
// 实际案例:多进程架构的下载管理器
四、性能优化实战
1. 动态速率控制
// 根据CPU负载调整生产速率
fun adjustRate() {
val cpuRate = getCpuUsage()
val delay = when {
cpuRate > 80 -> 1000L
cpuRate > 50 -> 500L
else -> 100L
}
producerHandler.postDelayed(produceTask, delay)
}
2. 优先级处理
// 使用优先级队列
private val queue = PriorityBlockingQueue<Data>(11) { d1, d2 ->
d1.priority - d2.priority
}
// 实际案例:消息APP的聊天消息处理
// 高优先级:红包消息、@消息
// 普通优先级:文本消息
// 低优先级:图片消息
五、深度应答
"请解释生产者消费者模型在Android中的应用"
推荐回答结构:
-
概念定义:"这是多线程协作的解耦模式,生产者生成数据,消费者处理数据..."
-
Android实现:"我们有多种实现方式,例如HandlerThread适合...,BlockingQueue适合..."
-
实战案例:"在电商APP中,我们用优先级队列处理订单,高优先级订单..."
-
优化经验:"通过动态速率控制,我们使CPU负载降低了30%..."
-
扩展思考:"结合协程的Channel,我们可以实现更简洁的代码..."
进阶问题应对:
Q:"如何避免内存泄漏?"
A:"1) 使用弱引用持有Context 2) 在onDestroy中清空队列 3) 使用LifecycleObserver自动管理"
Q:"多进程场景如何处理?"
A:"1) 使用Messenger跨进程通信 2) 共享文件作为队列存储 3) ContentProvider同步状态"