异步任务调度

问题

当客户端向服务层同时提交多个任务(Task)时,为了充分发挥服务器的处理计算能力,普通单线程已经不能满足我们的需求了,需要采用多线程或多进程的技术来并发处理task,服务器在处理并发任务时需要满足一下几个要求:

  • 1.任务提交后,希望服务器尽可能快的处理并返回结果
  • 2.多个任务同时处理时并不影响性能
  • 3.当某个任务执行过程中出错了,允许重试,并且不会阻碍其它task的处理

分析

  • 1.多个任务同时提交,并且希望服务器尽可能快的处理并返回结果,采用多线程技术来实现,针对每个任务,如果都分配一个线程去处理的话,那么当同时提交成千上万的任务的话,很容易导致服务器系统资源耗尽,服务器宕机。在分配任务时,创建和销毁线程很浪费资源,通过线程池技术来提高线程的执行效率,减去任务执行过程中的线程创建和销毁的时间,大大提高任务执行效率。通过线程池技术,使得系统初始化时存放一定量的线程,客户端提交task给服务器后,将各个task分配给现有的空闲线程去处理,但是当提交很多task的话,很明显,线程池里面的线程数量也会不足,那如何解决呢?在客户端提交task到服务器后,现将task提交到任务队列中(TaskQueue),系统执行task时,从任务队列中提取task再分配给线程池中的空闲线程去执行任务。
  • 2.当我们发布任务后,任务交给了服务层取处理,在处理的过程中难免会遇到一些特殊的问题,导致任务执行失败,为了保证任务可以有效的执行并实现我们需要的任务,还需要为任务处理提供一个重试机制,这样当系统执行任务失败的时候,就可以启动重试机制来再次处理提交的任务,增加任务执行的成功率。

设计

image

  • Client
    Client 模拟的是多个客户端,submit()方法用于提交task,提交的这个task类型为AsyncTask,该类为专用的任务类,下文会讲述。
  • AsyncExecutorService
    首先这个类的目的是创建出一个线程池 executor来,用于资源分配,需要初始化一些参数,比如线程数量,最大线程数量,线程存活时长,重试次数以及重试等待时间等,这其中还有一个隐藏的参数--> 任务队列,分配资源时从任务队列中随机选择任务,进行分配,当有任务执行完成后,存在空闲线程时,该executor又会进行资源再分配,从任务队列总选择相应的任务进行执行。
    该类还提供了执行任务的接口,从客户端传递过来的任务,在该类进行接收,并执行内部逻辑。
  • AsyncTask
    AsyncTask是一个Runnable类,整正执行任务的地方,这行的任务通过 抽象方法 doWork()对外提供,这样就可以实现不同的任务操作。在该类中主要实现了重试机制的逻辑,当任务执行失败时进行相应次数的重试执行,保证任务执行成功。

代码

Client.java

package com.ngsky.async;

/**
 * @Description TODO
 * @Author
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值