相信大家做程序遇到比较多的就是队列,排队问题。对于app上这种问题比较多,比如排队下载,排队发送,并发排队网络请求等等。

要如何自己做好一个这样的功能呢。

下面我给大家将一下我对这一块的理解。

首先在android上,用java编写的程序,需要了解一下队列Queue数据结构(如果有特别的兴趣的可以百度一下,资料很多,我就不粘贴了)。

这次我们主要用的是PriortyBlockingQueue,大家可以理解成一个有优先级排序的阻塞队列排队,注意是可以阻塞的。

具体的PriortyBlockingQueue内部实现是堆,有兴趣的也可以去详细查一下资料。

多的就不说了,很多资料大家都能找到,下面直接看实现代码。

TaskManager.class

public classTaskManager {

privatePriorityBlockingQueue mQueue;

privateTaskDispatcher[] mTaskDispatchers;

private volatile staticTaskManager ourInstance;

private final static intMAX_POOL_SIZE = 3;

privateAtomicInteger mSequenceGenerator = newAtomicInteger();

privateTaskManager() { mTaskDispatchers=newTaskDispatchers[MAX_POOL_SIZE];

startTask();

}

public staticTaskManagergetInstance() { if(ourInstance == null) {

synchronized(TaskManager.class) {

if(ourInstance == null) {

ourInstance = newTaskManager();

}

}

}

returnourInstance;

}

public voidstop() {

if(mTaskDispatchers!=null) {

intlen = mTaskDispatchers.length;

TaskDispatcher dispatcher;

for(inti = 0; i < len; i++) {

dispatcher = mTaskDispatchers[i];

if(dispatcher != null) {

dispatcher.quit();

}

}

}

}

public voidstartTask() {

stop();

for(inti = 0; i < mTaskDispatchers.length; i++) {

TaskDispatcher dispatcher = newTaskDispatcher(mQueue); mTaskDispatchers[i] = dispatcher;

dispatcher.start();

}

}

public voidcancelAll() {

stop();

mQueue.clear();

}

public voidcancelTask(Task task) {

if(task != null) {

task.cancel();

}

}

public voidaddTask(Task task) {

task.setSequence(getSequenceNumber());

mQueue.add(downloadTask);

}

}

首先是任务管理,整个类里面其实代码很简单有几个东西组成:

一个是线程个数的数组TaskDispatchers用来分发和执行Task使用。

MAX_POOL_SIZE 是线程池最大个数这里默认是3个。

AtomicInteger这里只是一个integer的原子操作,大家可以理解就是i++,不过他是线程安全的。

TaskDispatcher.class

public classTaskDispatcher extendsThread {

private volatile booleanmQuit = false;

privateBlockingQueue mQueue;

publicTaskDispatcher(BlockingQueue mQueue) {

this.mQueue = mQueue;

}

public voidquit() {

mQuit = true;

interrupt();

}

@Override

public voidrun() {

android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

Task task;

while(true) {

try{

task = mQueue.take();

if(!task.isRunning()) {

task.run();

}

} catch(InterruptedException e) {

if(mQuit) {

return;

}

continue;

}

}

}

}

分发任务类,其实主要就是用来运行每一个task使用的,本身自己就是一个无限循环的线程,永远在后台运行。这里其实就是要注意的就是停止线程的方法。因为本身的Queue是一个阻塞的,所以只要在外部调用打断会有catch的错误,通过方法来停止一个当前想取消的一个任务,随后需要一个变量来控制一下循环的结束。

Task.class

public abstract classTask implementsRunnable, Comparable {

privateInteger mSequence;

privateString uuid;

public enumPriority {

LOW,

NORMAL,

HIGH,

IMMEDIATE}

public voidTask() {

uuid= UUID.randomUUID().toString();

}

publicPriority getPriority() {

returnPriority.NORMAL;

}

public voidsetSequence(Integer sequence) {

this.mSequence= sequence;

}

@Overridepublic intcompareTo(Task o) {

if(o == null) {

return this.mSequence;

}

if(this.mSequence== null) {

this.mSequence= newInteger(0);

}

if(o.mSequence== null) {

o.mSequence= newInteger(0);

}

Priority left = this.getPriority();

Priority right = o.getPriority();

returnleft == right ?

this.mSequence- o.mSequence: right.ordinal() - left.ordinal();

}

@Overridepublic voidrun() {

}

publicString getUuid() {

returnuuid;

}

public voidsetUuid(String uuid) {

this.uuid= uuid;

}

}

最后一个就是我们的任务了,大家要注意的问题在于Comparable接口,因为刚才说过了,PriorytyBlockingQueue是一个阻塞有优先级的队列,而且在队列里面的类必须实现这个接口,目的是为了让排队在末尾或后面的任务一些需要优先执行的任务可以先执行。

注意:这里没有任务完成回调,需要自己设计,这个在这里就不讲了。

整个队列多线程就搞定了,这个时候如果你想网络请求使用这的话你只需要把自己的网络请求任务类继承Task,实现run方法(这个方法中实现请求的访问和回调)。

最后你只需要在发网络请求的地方调用:如TaskManager.getInstance().addTask(new HttpTask());

就搞定了,整个队列会一直循环执行。

最户提醒一下,在不需要的时候,需要调用一下TaskManager.getInstance().stop();停止所有线程避免造成泄漏。

java 排队任务_android实现排队任务相关推荐

  1. java 排队实现_实验排队功能实现(JAVA)

    1.功能要求 实验室有固定台数的设备供学生通过网络连接进行实验,一台设备只能同时被一个用户使用,一个用户只能占用一台设备. 下面是一个功能的简图: 2.实现方案 2.1 初始化 在项目启动之后,开始进 ...

  2. 做最好的-排队叫号系统;智能排队系统;排队叫号软件;排队管理系统;排队叫号机;取号机;取号机软件;排队软件;LED显示屏;LED大屏幕;LED条屏;触摸屏一体机;

    做最好的-排队叫号系统:智能排队系统:排队叫号软件:排队管理系统:排队叫号机:取号机:取号机软件:排队软件:LED显示屏:LED大屏幕:LED条屏:触摸屏一体机. 经过最新的测试和客户提出要求的结合, ...

  3. 排队模拟JAVA程序_java 模拟窗口排队

    public class MyQueue { private LinkedList q = new LinkedList(); /** * 排队 * @param e */ public synchr ...

  4. java排队系统设计_医院排队系统之简易设计

    有关排队系统的应用是很多的,本文是针对医院的排队挂号流程进行的简易设计.要设计排队系统,首先要分别设计出病人和专家的类,然后编写服务器类模拟出若干等侯的病人.最后分别编写出专家与病人的客户端.具体步骤 ...

  5. java排队系统模型,MMC排队系统模型

    MMC排队系统模型及应用 M/M/C排队模型及其应用 摘要:将随机服务系统中M/M/C排队模型应用到理发服务行业中.通过对某理发店进行调查,以10min为一个调查单位调查顾客到达数,统计了72个调查单 ...

  6. 游戏服务器排队系统,游戏服务器排队功能

    游戏服务器排队功能 内容精选 换一换 座席已签入座席登录后,获取当前座席已签入技能队列上的排队人数.设置成"GET".该接口仅支持GET方法,不支持PUT.POST和DELETE等 ...

  7. php 排队叫号源码,排队叫号机源代码

    [实例简介] 排队叫号系统,包括客户端,服务器,叫号端.可以语音,可以LED显示窗口,可以定制业务等.使用MYSQL数据库.需要的可以下载看看 [实例截图] [核心代码] QueuingSystem2 ...

  8. 显示12306服务器处理中正在排队,12306一直在排队中怎么办

    12306一直在排队中怎么办?想必很多玩家还不知道吧,那么小编就为大家带来12306一直在排队解决方法,下面就赶紧和小编一起去看看具体内容吧. 12306一直在排队解决方法: 大家都知道,使用1230 ...

  9. c语言 银行取号排队队列程序,银行排队队列问题则么解决

    我重新发了 #include #include #include #include #define N 30        ///队列最大人数 #define w  3         ///银行窗口 ...

最新文章

  1. ES6入门之对象扩展
  2. 用aspect在springboot中记录操作日志至数据库的详细过程
  3. c语言三目运算错误,c语言中三目运算符有什么用
  4. 魅族android面试题,【魅族小米IT面试题】面试问题:Android… - 看准网
  5. 烟台市建筑物矢量数据(Shp格式+带高度)
  6. uni-app 简易商城制作
  7. Maven:mvn 命令的基本使用
  8. 小学计算机课动画制作的评课稿,小学信息技术评课稿
  9. 阿里云个人申请短信验证码申请总是失败
  10. 《回炉重造》——泛型
  11. 网站建设制作需要多少钱呢?费用是多少?
  12. linux win10双系统启动顺序,Windows 10 和 Ubuntu 20.04 双系统 GRUB2 默认启动项的更改...
  13. Windows装机方案
  14. ADSO中的表和视图
  15. Nodejs后端框架搭建(express)
  16. 【Spring】Spring MVC原理及配置详解
  17. <A Tale of Evil Twins: Adversarial Inputs versus Poisoned Models>阅读笔记
  18. Python 实现 淘宝秒杀 聚划算 自己主动提醒 源代码
  19. 全自动生成、设置课表壁纸【完结】
  20. 创造力国际农民丰收节贸易会-万祥军:荒漠土地以色列淘金

热门文章

  1. python1000个常用代码-1000个常用的Python库和示例代码
  2. python 爬虫源代码-从零开始学Python网络爬虫_源代码.rar
  3. 用python画皮卡丘代码-用python绘制皮卡丘
  4. python使用教程pandas-python学习教程之Numpy和Pandas的使用
  5. python实现http下载文件-Python实现http文件下载
  6. 流程的python-流畅的Python
  7. php和python写爬虫-为什么写爬虫都喜欢用python?
  8. python白名单验证-JWT黑名单和白名单
  9. python算法与程序设计基础第二版-算法与程序设计基础(Python版) - 吴萍
  10. python中的二进制、八进制、十六进制的相互转换