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