首页 文章

基于队列内容的Android多线程作业执行程序

提问于
浏览
1

我正在开发一个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 回答

  • 0

    以下是有关线程池和最佳实践的Android文档中的一些信息:https://developer.android.com/training/multiple-threads/index.html

    它们提供了有关如何创建和使用线程池来处理后台操作的示例 .

  • 1

    请为jobManager提供逻辑 .

    您无需从头开始实现此功能 . 相反,只需使用ExecutorService API .

    据我所知,您尝试做的所有事情都可以使用该API完成 . 甚至可以处理给予UI线程优先权访问的要求;例如使用 PriorityQueue .

    从头开始实施一个职业经理来满足这些要求(坦率地说)毫无意义 .

相关问题