Java 自定义任务执行器或;我是在重新发明轮子吗?”;

Java 自定义任务执行器或;我是在重新发明轮子吗?”;,java,multithreading,concurrency,java-8,java-stream,Java,Multithreading,Concurrency,Java 8,Java Stream,我正在尝试创建一个实用程序类,该类将能够处理可运行程序包,并以不同的组合(同步、异步)执行它们 例如:假设这是一个类似json的复合任务表示。“[]”保持异步任务,“{}”保持同步任务 [ task, [task, task, task], {task, task, [task, task]} ] 这是(将)以方法链接的方式实现的: fromAsyncTasks( from(runnable), fromSyncedTasks(from(runnable

我正在尝试创建一个实用程序类,该类将能够处理可运行程序包,并以不同的组合(同步、异步)执行它们

例如:假设这是一个类似json的复合任务表示。“[]”保持异步任务,“{}”保持同步任务

[
    task,
    [task, task, task],
    {task, task, [task, task]}
]
这是(将)以方法链接的方式实现的:

fromAsyncTasks(
    from(runnable),
    fromSyncedTasks(from(runnable), from(runnable), from(runnable)),
    fromAsyncTasks(from(runnable), from(runnable), fromAsyncTasks(from(runnable), from(runnable)))
).execute();
正如您可能理解的,execute()以同步或异步方式递归调用其他任务execute()。此外,任务接口还支持terminate()停止(中断任务),因此,如果我保留对这些任务的引用,我将能够终止它们

因此,问题1是:是否有任何工具、库至少提供了这一功能

和#2:如果我使用流并行(异步情况)执行,如何终止它们

tasks.parallelStream().forEach(Runnable::run)
自Java8以来,该类是标准库的一部分。这个类基本上提供了构建所需的一切

为了直接支持您的用例,您需要某种抽象,即
可运行的
、同步任务列表或异步任务列表。在下面的代码中,这个抽象是class
Task

interface Task {
    CompletableFuture<Void> execute(
        CompletableFuture<Void> f, Executor e);
}
现在,您可以轻松创建可运行、同步和异步任务的任意嵌套结构,并使用任意
执行器执行它们。下面是一个简短的例子:

public static void main(String... args) {
    Task task = sync(
        wrap(() -> log("1")),
        async(
            wrap(() -> log("A")),
            wrap(() -> log("B")),
            wrap(() -> log("C"))),
        wrap(() -> log("2")),
        wrap(() -> log("3")));
    ExecutorService executor = Executors.newFixedThreadPool(4);
    task.execute(CompletableFuture.completedFuture(null), executor).join();
    executor.shutdown();
}
自Java8以来,该类是标准库的一部分。这个类基本上提供了构建所需的一切

为了直接支持您的用例,您需要某种抽象,即
可运行的
、同步任务列表或异步任务列表。在下面的代码中,这个抽象是class
Task

interface Task {
    CompletableFuture<Void> execute(
        CompletableFuture<Void> f, Executor e);
}
现在,您可以轻松创建可运行、同步和异步任务的任意嵌套结构,并使用任意
执行器执行它们。下面是一个简短的例子:

public static void main(String... args) {
    Task task = sync(
        wrap(() -> log("1")),
        async(
            wrap(() -> log("A")),
            wrap(() -> log("B")),
            wrap(() -> log("C"))),
        wrap(() -> log("2")),
        wrap(() -> log("3")));
    ExecutorService executor = Executors.newFixedThreadPool(4);
    task.execute(CompletableFuture.completedFuture(null), executor).join();
    executor.shutdown();
}

某些任务在其他任务之后执行,一定有原因。这些原因应该以某种方式表现出来——如信息或信号。当它们被显式表示时,您可以将类似json的符号转换为


对于要执行数据流图的库,请查看我的。

某些任务在其他任务之后执行,这一定是有原因的。这些原因应该以某种方式表现出来——如信息或信号。当它们被显式表示时,您可以将类似json的符号转换为


对于要执行数据流图的库,请查看我的。

或,…@Holger我确实知道Executor接口,但问题是将有许多业务逻辑动态执行某些任务(同步或异步或组合)如果我们使用Executors,代码将很难可读。澄清一下:你是说异步并行,同步顺序?或者,…@Holger我确实知道Executor接口,但问题是会有很多业务逻辑动态执行某些任务(同步或异步或组合),如果我们使用Executor,代码几乎不可读。澄清一下:你是说异步并行,然后按同步顺序执行?谢谢,我不知道CompletableFuture和CompletionStage接口。如果我写这个实现,它将需要几个类,相反,这个实现非常漂亮,但代码对我来说看起来像majic,尽管我理解它的作用,但我肯定我从来没有这样想过,也许是因为我从未使用过函数式编程或任何闭包语言。你能推荐一些能促进lambda思维方式的书籍或文章吗?我用过这个,但我不确定如何从已完成的任务中获取值?@Vach:您的原始代码中没有返回值,所以我也省略了它们,因为这会使代码更复杂(特别是在异步执行方面)。不过,
CompletableFuture
的type参数指定了返回类型,而方法
join
返回结果。@Vach:我不知道有哪本书介绍了Java 8功能的上述用法。代码非常特定于Java8。一本关于兰博达斯的通俗书是没有用的。也许将来会有更有效的Java。谢谢你,我不知道CompletableFuture和CompletionStage接口。如果我写这个实现,它需要几个类,相反,这个实现很漂亮,但代码在我看来像majic,虽然我了解它的功能,但我肯定我从来没有这样想过,也许因为我从来没有使用过函数式编程或任何以闭包为中心的语言。你能推荐一些能促进lambda思维方式的书籍或文章吗?我用过这个,但我不确定如何从已完成的任务中获取值?@Vach:您的原始代码中没有返回值,所以我也省略了它们,因为这会使代码更复杂(特别是在异步执行方面)。不过,
CompletableFuture
的type参数指定了返回类型,而方法
join
返回结果。@Vach:我不知道有哪本书介绍了Java 8功能的上述用法。代码非常特定于Java8。一本关于兰博达斯的通俗书是没有用的。也许将来会有更有效的Java。