Java 8 Streams - 超时?

2022-09-02 11:21:34

我想遍历一个巨大的数组,并执行一组需要很长时间的复杂指令。但是,如果超过30秒,我希望它放弃。

前任。

final long start = System.currentTimeMillis();
myDataStructure.stream()
    .while(() -> System.currentTimeMillis() <= start + 30000)
    .forEach(e ->
    {
      ...
    });

我想避免在通话中说是否满足某个条件。returnforEach


答案 1

我会为此创建一个自定义池,如下所示:

ForkJoinPool forkJoinPool = new ForkJoinPool(1);
    try {
        forkJoinPool.submit(() ->
        IntStream.range(1, 1_000_000).filter(x -> x > 2).boxed().collect(Collectors.toList()))
                .get(30, TimeUnit.MILLISECONDS);
    } catch (TimeoutException e) {
        // job not done in your interval
    }

答案 2

如果在这种情况下迭代流或数组与实际执行操作相比更便宜,那么只需使用谓词并筛选时间是否结束。

final long end = System.nanoTime() + TimeUnit.SECONDS.toNanos(30L);
myDataStructure.stream()
    .filter(e -> System.nanoTime() <= end)
    .forEach(e ->
    {
      ...
    });

问题是您是否需要知道哪些元素已被处理过。通过上述操作,您必须检查之后特定元素是否发生了副作用。


推荐