java多线程任务编排

在java里有很多高并并发和多线程的工具高,本身没也可以实现任务编排,但是代码量和复用性很差,要考虑的事情很多,一旦遗漏就会出现异常,最近也在做这样的task,也借机会,开发了一个小的工具包,增加了复用性,代码也简单。
源码也已经放在 https://github.com/yanghaiji/AsyncTask,目前这个项目在开发中,也希望有兴趣的朋友一起加入

AsyncTask

AsyncTask是Java并发工具包的扩展,它提供了一种简便的方式来管理和调度多线程执行的任务。
其主要功能是在多线程环境下,简化任务之间的依赖关系,从而使得开发者能够将更多的精力集中在业务逻辑的实现上,
而非任务调度的复杂性。通过使用 AsyncTask,开发者可以更加高效地处理并发任务,提高程序的性能和响应速度,
同时也降低了多线程编程的难度和风险。

参考手册

Worker

通过Worker创建任务,同时可以指定失败之后的回调,让我们进行异常的处理

  • 示例
    // 创建任务
    Worker<Integer, Integer> taskA = new Worker<>("A", () -> {
        sleep(1000);
        return 1;
    },
        @Override
        public Integer onFailure(Throwable t) {
            System.out.println("Task A failed with exception: " + t.getMessage());
            return -1;
        }
    });

TaskScheduler

核心的任务编排工具,包括了任务的添加,运行,编排任务,等待其它任务完成后在执行当前任务

 TaskScheduler scheduler = new TaskScheduler(4); 

 TaskScheduler schedulerAndShutdown = new SchedulerBuilder()
            .setThreadPoolSize(20)
            .addTask(taskA, 1000)
            .addTask(taskB, 2000)
            .addTask(taskC, 2000)
            .addTask(taskD, 2000)
            .runTask("A", 3000)
            .runTask("B", 3000)
            .runTaskAfter("C", 3000, "A", "B")
            .runTaskAfterWithResult("D", resultMap -> {
                // 使用resultMap处理结果
                return 5;
            }, 4000, "C")
            .buildAndShutdown();

完整示例

public static void main(String[] args) {
        TaskScheduler scheduler = new TaskScheduler(4);  // 设置线程池大小为4

        // 创建任务
        Worker<Integer, Integer> taskA = new Worker<>("A", () -> {
            sleep(1000);
            return 1;
        }, new ICallback<Integer, Integer>() {
            @Override
            public void callback(Integer result) {
            }

            @Override
            public Integer onFailure(Throwable t) {
                System.out.println("Task A failed with exception: " + t.getMessage());
                return -1;
            }
        });

        Worker<Integer, Integer> taskE = new Worker<>("E", () -> {
            sleep(1000);
            return 2;
        }, new ICallback<Integer, Integer>() {
            @Override
            public void callback(Integer result) {
            }

            @Override
            public Integer onFailure(Throwable t) {
                System.out.println("Task E failed with exception: " + t.getMessage());
                return -1;
            }
        });

        Worker<Integer, Integer> taskB = new Worker<>("B", () -> {
            sleep(1000);
            return 3 / 0;  // 模拟异常
        }, new ICallback<Integer, Integer>() {
            @Override
            public void callback(Integer result) {
            }

            @Override
            public Integer onFailure(Throwable t) {
                return -1;
            }
        });

        Worker<Integer, Integer> taskC = new Worker<>("C", () -> {
            sleep(1000);
            return 4;
        }, new ICallback<Integer, Integer>() {
            @Override
            public void callback(Integer result) {
            }

            @Override
            public Integer onFailure(Throwable t) {
                System.out.println("Task C failed with exception: " + t.getMessage());
                return -1;
            }
        });

        Worker<Integer, Integer> taskD = new Worker<>("D", () -> {
            sleep(1000);
            return 5;
        }, new ICallback<Integer, Integer>() {
            @Override
            public void callback(Integer result) {
            }

            @Override
            public Integer onFailure(Throwable t) {
                System.out.println("Task D failed with exception: " + t.getMessage());
                return -1;
            }
        });

        // 添加任务
        scheduler.addTask(taskA, 2000);
        scheduler.addTask(taskE, 2000);
        scheduler.addTask(taskB, 2000);
        scheduler.addTask(taskC, 2000);
        scheduler.addTask(taskD, 2000);

        // 执行任务,注意顺序和依赖
        scheduler.runTask("A", 2000);
        scheduler.runTask("E", 2000);
        scheduler.runTaskAfter("B", 2000, "A");
        scheduler.runTaskAfter("C", 2000, "E");
        scheduler.runTaskAfter("D", 2000, "B", "C");

        scheduler.allOf("A", "B", "C", "D", "E");

        // 打印任务状态
        // 获取任务状态
        System.out.println("Task A status: " + scheduler.getTaskStatus("A") +" results : " + taskA.getResult());
        System.out.println("Task E status: " + scheduler.getTaskStatus("E") +" results : " + taskE.getResult());
        System.out.println("Task B status: " + scheduler.getTaskStatus("B") +" results : " + taskB.getResult());
        System.out.println("Task C status: " + scheduler.getTaskStatus("C") +" results : " + taskC.getResult());
        System.out.println("Task D status: " + scheduler.getTaskStatus("D") +" results : " + taskD.getResult());

        // 关闭任务调度器
        scheduler.shutdown();
        System.out.println("All tasks are completed");
    }

更多的使用方式请参考 https://github.com/yanghaiji/AsyncTask/tree/main/src/test/java/com/javayh/async/task

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杨同学~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值