【发布时间】:2021-02-14 13:18:36
【问题描述】:
我有 2 个执行者:
ExecutorService executorDownload = Executors.newFixedThreadPool(n);
ExecutorService executorCalculate = Executors.newFixedThreadPool(m);
首先我需要将任务放入 executorDownload 中,然后在它们完成后将它们放入 executorCalculate 中,然后得到结果。我写了下一个流:
long count = IntStream.range(0, TASK_NUMBER)
.boxed()
.parallel()
.map(i -> executorDownload.submit(new Download(i)))
.map(future -> calculateResultFuture(executorCalculate, future))
.filter(Objects::nonNull)
.filter(Main::isFutureCalculated)
.count();
public static Future<CalculateResult> calculateResultFuture(ExecutorService executorCalculate, Future<DownloadResult> future) {
try {
return executorCalculate.submit(new Calculate(future.get()));
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return null;
}
public static boolean isFutureCalculated(Future<CalculateResult> future) {
try {
return future.get().found;
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return false;
}
有没有可能开始
.map(future -> calculateResultFuture(executorCalculate, future))
之前
.map(i -> executorDownload.submit(new Download(i)))
结束。我需要在第一张地图开始后开始第二张地图。
【问题讨论】:
标签: java multithreading stream