软件简介

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();// 获取组中任务执行时设置的数据(线程安全)
展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (0)

加载中
更多评论
发表于信息安全专区
11/20 14:31

ATask 多用途异步任务执行框架-更新 V1.1.0

更新V1.1.0,增加监控功能,可实时监控任务运行情况。 使用方法: 第一种方式: 注册一个 ServletRegistrationBean 类 public ServletRegistrationBean<StatViewServlet> druidStatViewServlet() { TaskEngine engine = new TaskEngine.Builder() .build(); engine.prepareGroup("test...

0
11
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了博客
2018/04/17 22:15

Jmeter----A接口response中body的某一个参数传递给B接口request的body中使用(参数的传递)

示例:将接口“获取待办列表”response中body的id值传递给接口“删除待办”request的body中使用; 操作步骤如下: 第一步:给“获取待办列表”添加“正则表达式提取器” 第二步、配置需要获取id值的正则,注意:在我使用中若直接填写"id":"(.*?)",获取不到id值,所以我在要提取的值双引号前加了斜杠/ 说明: (1)引用名称...

0
0
发表了博客
2013/09/25 18:46

Android中进程与线程及如何在子线程中操作UI线程

1. Android进程 一个应用程序被启动时,系统默认创建执行一个叫做"main"的线程。这个线程也是你的应用与界面工具包(android.widget和android.view包中的组件)交互的地方。于是main线程也被称为界面线程。 这种单线程的模式会带来低性能,除非你能正确的优化你的程序。 打 个比方:用户触摸屏幕上的一个按钮时的点击事件...

0
8
发表了博客
2018/02/13 19:22

Jmeter接口测试-获取所有任务API

获取所有任务 GET /api/tasks 接口获取所有的任务,该接口需要鉴权。 注意,默认情况下鉴权是关闭的。请确保app.coffee中的app.use(express_jwt(secret: jwt_secret).unless(path: ['/register', '/login']))的这条语句没有被注释,然后使用coffee -c app.coffee重新编译。 鉴权失败 我们试着在没有提供token的情况下访问...

0
0
发表了博客
2018/04/23 22:43

jmeter正则表达式书写

在测试过程中,经常会有以下几种场景,如A接口的返回值,用于B接口中,而且A登陆的账户,每次登陆,这个sid值还是变化的。那么在实际工作中,如何才能A接口中提取参数到B接口中?接下来我们就可以用正则表达式来解决这个问题。 场景如下,一个登陆接口,登陆后要使用该账号去购买标,买标的时候要使用A的登陆信息值。通过...

0
0
发表了博客
2018/11/23 14:00

[搬运工系列]-JMeter(三)参数传递

【一】参数化 录制脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统。 这个时候就需要对用户名和密码进行参数化,使每个虚拟用户都使用不同的用户名和密码进行访问。 1、准备脚本,测试数据 1)、写一个脚本(可以用badboy工具录制),在jmeter中...

0
0
发表了博客
2018/04/25 22:18

Java多线程实现的三种方式

对于所有语言来说,多线程的编程是绝不可少的。同样的Java语言也包含了多线程的开发。首先,我们先来了解一下Java语言的多线程实现方式。 一、Java 多线程实现方式 java中实现多线程的方式有三种,接下来我将会逐个进行介绍。 1.继承Thread类 继承Thread类是Java中比较常见,也是很基础的一种实现Java多线程的方式。实现...

0
0
发表了博客
2019/02/20 09:51

Gradle入门到实战(一) — 全面了解Gradle

声明:本文来自汪磊的博客,转载请注明出处 可关注个人公众号,那里更新更及时,阅读体验更好: 友情提示由于文章是从个人公众号拷贝过来整理的,发现图片没有正常显示,没关注公众号的同学可通过如下链接查看:https://mp.weixin.qq.com/s?__biz=Mzg2NzAwMjY4MQ==&mid=2247483789&idx=1&sn=4b3bb2ab721c8ed7e05f1e8b2e0...

0
0
发表于开发技能专区
2015/07/27 19:34

RabbitMQ erlang "work queues"

参考文章:http://www.rabbitmq.com/tutorials/tutorial-two-python.html 前面我们写了一个发送和接收消息的队列。 这次我们将创建一个工作队列,这个队列被用于在多个worker之间分发耗时任务。 The main idea behind Work Queues (aka: Task Queues) is to avoid doing a resource-intensive task immediately and havi...

0
0
发表了博客
2013/01/21 14:52

zz from MSDN: .net 4.5 - Async returns types an...

You can find more formal discussion on the Async and Await here in this link. Control Flow in Async Programs (C# and Visual Basic) You can write and maintain asynchronous programs more easily by using the Async and Await keywords. However, the results might surprise you if you don't understand ho...

0
0
发表了博客
03/14 10:42

GUADEC: porting GNOME to Android

https://lwn.net/Articles/510465/ By Nathan Willis August 15, 2012 Rightly or wrongly, GNOME is regarded by many casual users as "a Linuxdesktop environment." It also runs on various BSD and Solarisflavors, of course, and there has been considerable discussionrecently of developing a "GNOME OS" de...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
28 收藏
分享
返回顶部
顶部