- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个实用程序类,它将能够处理可运行程序包并以不同的组合(同步、异步)执行它们。
例如:想象这是一个类似 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()。此外,任务接口(interface)支持终止()来停止(中断任务),因此如果我保留对这些任务的引用,我将能够终止它们。
所以问题#1是:是否有任何工具、库至少提供此功能?
和#2:如果我使用流进行并行(异步情况)执行,如何终止它们?
tasks.parallelStream().forEach(Runnable::run)
最佳答案
自 Java 8 起,类 java.util.concurrent.CompletableFuture是标准库的一部分。该类基本上提供了构建您想要的内容所需的一切。
为了直接支持您的用例,您需要某种抽象,即Runnable
、同步任务列表或异步任务列表。在下面的代码中,这个抽象是类Task
:
interface Task {
CompletableFuture<Void> execute(
CompletableFuture<Void> f, Executor e);
}
以下是创建三种不同类型任务的三种工厂方法:
static Task wrap(Runnable runnable) {
return (f, e) -> f.thenRunAsync(runnable, e);
}
static Task sync(Task... tasks) {
return (f, e) -> {
for (Task task : tasks) {
f = task.execute(f, e);
}
return f;
};
}
static Task async(Task... tasks) {
return (f, e) -> tasks.length == 0 ? f :
CompletableFuture.allOf(
Arrays.stream(tasks)
.map(t -> t.execute(f, e))
.toArray(CompletableFuture[]::new));
}
现在,您可以轻松创建可运行、同步和异步任务的任意嵌套结构,并使用任意执行器
执行它们。这是一个简短的示例:
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();
}
关于java - 自定义任务执行器或 "am I reinventing the wheel?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24243170/
好的,公平的警告:这是我的 ridiculous question 的后续行动从上周开始。虽然我认为这个问题并不那么荒谬。无论如何,这里是: 上一个荒谬的问题: 假设我有一些基本特征 T带有子类 A
我正在尝试创建一个实用程序类,它将能够处理可运行程序包并以不同的组合(同步、异步)执行它们。 例如:想象这是一个类似 json 的复合任务表示。 “[]”保持异步任务,“{}”保持同步任务。 [
我正在尝试了解如何实现 R 树,它将用于“选择”边界矩形中包含的一组几何对象。我检查了 article在维基百科上,它以 B-Tree 显示了数据布局的示例. 我可以写一个 B-Tree 并用它来写一
我正在为一个项目制作 IVR 系统,并决定使用 Twilio处理电话部分(调用和接听电话,发送和接收短信)。这将显示一个带有 IVR 前端的网站,允许用户使用他们的按键式电话浏览该网站。 我并没有让所
我需要在一台机器上实现非常快速、低延迟、高吞吐量的进程间(或应用程序域间)通信。 消息通常每隔几毫秒就会流动一次(但在几分钟内,每毫秒甚至可能有多达 3-5 条消息),每条消息的大小不到 1KB,目标
我是一名优秀的程序员,十分优秀!