Java 8 Streams - 超时?

时间:2017-08-01 08:11:14

标签: java java-8 java-stream

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

离。

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

如果符合某个条件,我想避免在return来电中说forEach

5 个答案:

答案 0 :(得分:17)

我会为此创建一个自定义池,例如:

<script type="text/javascript">
  window.opener.location.href = '@Url.Action("Action", "EventstController")', window.close();
</script>

答案 1 :(得分:15)

由于 forEach没有break,我认为您可以为break创建自定义例外循环:

myDataStructure.stream()
    .forEach(e ->
    {
      if (System.currentTimeMillis() <= start + 30000) {
          throw new MyTimeOutException()
      }
    });

你可以抓住捕获这个例外

答案 2 :(得分:15)

如果在这种情况下迭代流或数组与实际执行操作相比是便宜的,而不仅仅是使用谓词并过滤时间是否结束。

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

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

答案 3 :(得分:5)

您可以使用.allMatch()是一个短路运算符来终止流的事实:

final long start = System.currentTimeMillis();
myDataStructure.stream()
    .allMatch(e ->
    {
      // your task here
        return System.currentTimeMillis() <= start + 30000;
    });

答案 4 :(得分:3)

正如OP中的评论所说,在Java 8中将错过takeWhile / dropWhile(将在Java 9中添加)。没有任何理由尝试通过异常或其他代码来实现逻辑,因为代码只是看起来如此丑陋而且完全不合理,即使只是为了练习。我认为使用第三方库是一个更好,更好的解决方案,例如StreamEx

StreamEx(source).takeWhile(() -> System.currentTimeMillis() <= start + 30000)
                .forEach(e -> { ... });