我试图在Java中并行运行两个函数,但我有一个特定的标准,我不知道它是否得到满足。下面是我的代码。执行器服务下面的代码在主函数中,上面只有一些其他代码,与问题无关,所以我决定减少代码以提高可读性。
private static final ExecutorService executorService = Executors.newFixedThreadPool(2);
if (!weekly || rowData.get("M/W").equals("W")) {
if (callData != null) {
Future<?> bidPriceFuture = executorService.submit(() -> {
getBidPrice(rowData.get("Symbol"), callData, premiumC, percentMinC, "Call",
rowData.get("Call EPR").equals("#N/A") ? 0 : Double.parseDouble(rowData.get("Call EPR")), rowData);
});
Future<?> updateVerticalsFuture = executorService.submit(() -> {
updateVerticals(rowData.get("Symbol"), callData);
});
bidPriceFuture.get();
updateVerticalsFuture.get();
}
if (putData != null) {
System.out.println("Running the Put Stuff");
Future<?> putFuture = executorService.submit(() -> {
getBidPrice(rowData.get("Symbol"), putData, premiumP, percentMinP, "Put",
rowData.get("Put EPR").equals("#N/A") ? 0 : Double.parseDouble(rowData.get("Put EPR")), rowData);
});
Future<?> updateVerticalPut = executorService.submit(() -> {
updateVerticals(rowData.get("Symbol"), putData);
});
putFuture.get();
updateVerticalPut.get();
}
总而言之,我想针对第一个 if 语句和第二个 if 语句并行运行 getBidPrice 和 updateVerticalsFuture。但是,由于 API 限制,我只想在第一个语句中的两个进程都完成后才启动第二个 if 语句的进程。我对此的第一个解决方案是将 .get() 添加到 Future 对象,但我认为这会停止实际的并行性,因为如果我调用 bidPriceFuture.get(),那么我不知道其他函数是否正在运行的背景。鉴于我所拥有的标准,我将不胜感激有关如何真正并行运行这两个功能的任何建议。
ExecutorService
是 Autocloseable
利用
ExecutorService
是Autocloseable
这一事实。这意味着您可以使用 try-with-resources 语法在任务完成后自动关闭执行器服务。