我正在开发一个Android应用程序,在应用程序中我执行了很多后台任务 . 要求是所有请求都应该串行处理并且可以并行执行 . 例如:假设我一个接一个地收到任务请求 . 要添加这些任务,我正在维护请求队列 . 假设当前队列状态为
(头)Task1 - > Task2 - Task3 - Task4 -Task5 - Task6(Tail)
我有一个线程池,它并行执行任务 . 执行程序始终在头部选择任务并提交给线程池执行 . 在我的要求中,有时我需要从队列中删除不再需要的任务 . 并且设计使得删除旧任务不再需要 . 假设线程池正在执行Task1和Task2,而剩余的任务正在队列中等待 . 当前队列状态是
(头)Task3 - Task4 -Task5 - Task6(Tail)
假设调用删除旧任务,即Task3和Task4 . 应删除这些任务,并将Task4作为线程池的下一个任务提交 .
我需要的是:我需要一个作业管理器来管理这些操作,例如1.连续检查请求队列并将任务分派给线程池2.每当调用removeTask时,删除任务,然后继续从队列中调度事件,直到队列变空3.如果队列变空,则线程需要等待/休眠,直到下一个请求进入队列 . 4.作业管理器应监视并选择队列中的任务并执行执行程序服务,当队列为空时进入等待状态或睡眠状态,并在队列中有项目时唤醒以执行任务并继续... 5.(重要)我希望在访问请求队列时给予UI线程优先权 .
我有:1 . UI线程和作业管理器共享的请求队列的原子引用(另一个背景线程)2 . 就绪任务
我想过要用
while(true) {
//check for any items in the queue and execute
}
在作业管理器run()方法中,但在队列为空时不必要地消耗CPU
请为jobManager提供逻辑 .
还有一个问题 . 创建请求队列的原子引用是否可以确保线程安全?或者我应该使请求队列变量同步?
2 回答
以下是有关线程池和最佳实践的Android文档中的一些信息:https://developer.android.com/training/multiple-threads/index.html
它们提供了有关如何创建和使用线程池来处理后台操作的示例 .
您无需从头开始实现此功能 . 相反,只需使用ExecutorService API .
据我所知,您尝试做的所有事情都可以使用该API完成 . 甚至可以处理给予UI线程优先权访问的要求;例如使用
PriorityQueue
.从头开始实施一个职业经理来满足这些要求(坦率地说)毫无意义 .