gpt4 book ai didi

java - 使用 java future 不需要本地可变状态

转载 作者:行者123 更新时间:2023-12-01 11:49:08 28 4
gpt4 key购买 nike

我编写了一些代码,这些代码本质上负责通过我向客户提供的名为“orchestrate”的库方法按顺序编排多个 API(是的,我知道这么原始)。这个编排方法背后的内容只不过是一个循环,按照接收到的顺序执行 API,这些循环又被委托(delegate)给许多类,这些类包含一些业务逻辑,用于构建请求、调用 API、执行一些验证响应并最终返回 api 结果。因此,如果客户端发送了 api 列表:
{a1, a2, a3, a4, a5}
它会以完全阻塞的方式依次执行每个 api。

我正在尝试将其增强到能够根据我如何从客户端接收指令来并行调用多个 API。将其视为客户端向我发送一个列表列表,例如: { {a1, a2}, {a3}, {a4, a5} }这意味着我想并行执行 a1 和 a2(这意味着构建它们的请求、调用 api、验证响应)。然后等到我确定他们都完成了。然后执行a3,并等待直到我确定它完成了。最后我想执行 a4 和 a5 并遵循通常的模式。

现在,我很想使用 future 来实现它们提供的简单抽象,以使用 .get() 方法执行方法并等待响应。但我注意到 executorService 下面需要的是 future 的 call() 方法的调用。这很好,但让我认为每个类实现的 call() 方法可能需要访问“本地”数据才能完成其工作(毕竟,我无法通过call() 方法(任何特定参数)。我真的想避免持有任何本地可变状态,因为这会带来副作用。

有没有办法让我不保留本地状态并仍然使用 future 来处理我的多线程用例?或者我对 future 的理解完全错误并且我错过了一些明显的东西?如果没有,是否有关于一些替代方案的良好前进道路的建议?

最佳答案

好的,现在您有一个类以阻塞方式从网页获取一些数据,并接受一些参数:

public class DataFetcher {
public Data fetchData(int param1, int param2) {
// ...
}
}

现在您想要同时执行此方法两次,并取回 future。所以你只需要创建一个Callable:

final DataFetcher fetcher = new DataFetcher();
Callable<Data> task1 = new Callable<>() {
@Override
public Data call() {
return fetcher.fetchData(1, 2);
}
};
Callable<Data> task2 = new Callable<>() {
@Override
public Data call() {
return fetcher.fetchData(3, 4);
}
};

Future<Data> result1 = executorService.submit(task1);
Future<Data> result2 = executorService.submit(task2);

我在这里没有看到任何可变状态。

为了避免重复代码和使用匿名类,您可以定义一个顶级类:

public DataFetcherTask implements Callable<Data> {

private final DataFetcher fetcher;
private final int param1;
private final int param2;

public DataFetcherTask(DataFetcher fetcher, int p1, int p1) {
this.fetcher = fetcher;
this.param1 = p1;
this.param2 = p2;
}

@Override
public Data call() {
return fetcher.fetchData(param1, param2);
}
};

然后像这样使用它:

Future<Data> result1 = executorService.submit(new DataFetcherTask(fetcher, 1, 2));
Future<Data> result2 = executorService.submit(new DataFetcherTask(fetcher, 3, 4));

这里仍然没有可变状态的痕迹。

关于java - 使用 java future 不需要本地可变状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28921213/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com