aTask

简单的多用途异步任务执行框架
授权协议 MIT
开发语言 Java
所属分类 程序开发、 作业/任务调度
软件类型 开源软件
地区 国产
投 递 者 叶元凯
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

aTask

ATask

一个简单的多用途异步任务执行框架

主要特性

  1. 操作简便,采用链式调用
  2. 多种任务类型:可设置回调的任务,可获取返回结果的任务,任务组
  3. 可自定义任务的类型,ID,超时时间等参数
  4. 灵活,可阻塞当前线程,亦可设置回调方法
  5. 实时获取正在运行任务状态,对已完成任务进行自定义处理

使用说明

引入

Maven

<dependency>
    <groupId>com.github.jonzhang3</groupId>
    <artifactId>aTask</artifactId>
    <version>1.0.2</version>
</dependency>

示例

首先创建任务执行的引擎(线程池)

TaskEngine engine = new TaskEngine.Builder()
    .corePoolSize(3)// 设置核心线程池大小,默认为系统 CPU 核数
    .maxPoolSize(100)// 设置线程池的最大大小,默认为 Integer.MAX_VALUE
    .keepAliveSeconds(1000)// 设置线程的最大空闲时间,默认为 60 秒
    // 设置任务等待队列的大小,默认为 Integer.MAX_VALUE
    // 如果设置的为负数,则采用 SynchronousQueue,否则采用 LinkedBlockingQueue
    .queueCapacity(20)
    // 设置线程池的任务拒绝策略
    .rejectedExecutionHandler(RejectedExecutionHandler)
    .completedTaskHandler(handler)// 设置对已完成任务的处理回调
    .build();
// 可通过 getRunningTasks() 方法获取当前正在执行的任务

1. 回调处理任务执行结果的任务的使用

Task task = engine.buildTask(ctx -> {
        ctx.onProgress(100);// 设置进度值,将调用进度回调函数
        ctx.onSuccess("1", "2", "3");// 设置任务执行成功,将调用结果回调函数
        ctx.onError(Exception);// 设置任务执行失败,将调用结果回调函数
        // 如果 onSuccess 和 onError 都调用了,则第首先执行的方法将会调用成功
    })
    .type("type")// 设置任务的类型
    .id("id")// 设置任务的 ID
    .progress(progress -> {})// 设置任务的进度回调
    // 设置任务的结果回调
    // 如果任务执行失败,error 则不为 null;如果任务执行成功,error 则为 null
    .end((ctx, error) -> {
        if(error != null) {// 执行成功
            ctx.getResult();// 获取 onSuccess 设置的数据
        } else {// 执行失败
            log.error(error);// 打印错误
        }
    })
    .build();
engine.go(task);// 最后调用 TaskEngine 的 go 方法执行该任务
task.await(); // 该方法会阻塞当前线程,如果你需要等待任务执行完成再继续执行,则调用该方法

2. 具有返回结果的任务的使用

ResultTask<String> resultTask = engine.buildResultTask(ctx -> {
        ctx.onProgress(200);
        return "success";// 返回结果数据
    })
    .type("type")
    .id("id")
    .progress(i -> {})
    .build();
engine.go(resultTask);
// 获取返回结果
// 该方法会阻塞当前线程
String result = resultTask.get();

3. 任务组的使用

TaskGroup group = engine.prepareGroup();// 创建一个任务组
// 添加并执行一个任务
group.go(group.buildItem(ctx -> {
    ctx.group().incrementCounter();// 计数器 +1(线程安全)
    ctx.group().addData("data");// 设置数据,方便后续使用
}).build());
group.await();// 等待线程组中所有的任务执行完成
group.getCounter();// 获取计数器的结果
Data data = group.getData();// 获取组中任务执行时设置的数据(线程安全)
 相关资料
  • 这是在一次Android采访中被问到的。有人问我是否可以从异步任务 1 的 doInBackground() 方法(让它成为 Task1)启动另一个异步任务(让它成为 Task2)。我浏览了文档,其中说了以下内容: 必须在UI线程上创建任务实例。 必须在 UI 线程上调用 execute(Params...)。 根据这些陈述,我认为从另一个任务的后台方法启动一个任务是不可能的。此外,async任务

  • 在Server程序中如果需要执行很耗时的操作,比如一个聊天服务器发送广播,Web服务器中发送邮件。如果直接去执行这些函数就会阻塞当前进程,导致服务器响应变慢。 Swoole提供了异步任务处理的功能,可以投递一个异步任务到TaskWorker进程池中执行,不影响当前请求的处理速度。 程序代码 基于第一个TCP服务器,只需要增加onTask和onFinish 2个事件回调函数即可。另外需要设置task

  • 本文向大家介绍C#异步执行任务的方法,包括了C#异步执行任务的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#异步执行任务的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 请纠正我做错的地方。代码如下:

  • 我正在探索使用Spring Boot的异步servlet。据我所知,异步servlet用于在一个线程中执行长时间运行的任务,而不是容器为处理请求而启动的线程,这样容器就可以使用自己的线程来处理其他连接。基于这样的理解,我尝试了以下代码: 但问题是,运行的同一线程正在调用方法。不是应该不一样吗?

  • 问题内容: 我在一个比较大的Web应用程序上工作,后端主要使用PHP。代码中有几个地方需要完成一些任务,但是我不想让用户等待结果。例如,在创建新帐户时,我需要向他们发送欢迎电子邮件。但是,当他们按下“完成注册”按钮时,我不想让他们等到实际发送电子邮件之后,我只想开始该过程,并立即向用户返回一条消息。 到目前为止,在某些地方,我一直在使用exec()感觉像是被黑客入侵。基本上是这样的: 这似乎可行,

  • 我正在试验Python 3.4的asyncio模块。由于没有使用asyncio的MongoDB生产就绪包,我编写了一个小包装类,在执行器中执行所有mongo查询。这是包装: 我想异步执行插入,这意味着执行它们的协程不想等待执行完成。asyncio手册声明,所以我构造了这个测试脚本: 当我运行脚本时,我得到以下结果: 应该有一行指示mongo查询已完成。当我从这个协程而不是使用异步IO运行它时,我可

  • 本文向大家介绍Python的Tornado框架的异步任务与AsyncHTTPClient,包括了Python的Tornado框架的异步任务与AsyncHTTPClient的使用技巧和注意事项,需要的朋友参考一下 高性能服务器Tornado Python的web框架名目繁多,各有千秋。正如光荣属于希腊,伟大属于罗马。Python的优雅结合WSGI的设计,让web框架接口实现千秋一统。WSGI 把应用