java8 streams

我最喜欢Java 8的功能之一是流API。 最终,它消除了代码中的几乎所有循环,并使您可以编写更具表现力和重点的代码。

今天,我意识到它可以用于其他用途:作为ForkJoinPool一个不错的前端。

问题:执行器样板

假设我们要并行运行许多任务。 没什么好说的,让我们说它们每个都只是打印出执行线程的名称(因此我们可以看到它并行运行)。 我们要在完成所有操作后恢复执行。

如果要使用ExecutorService并行运行一堆任务,则可能需要执行以下操作:

ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {executor.submit(() -> System.out.println(Thread.currentThread()));
}
executor.shutdown();
try {executor.awaitTermination(1, TimeUnit.SECONDS);
} catch (InterruptedException ex) {// TODO handle...
}

现在,这是很多代码! 但是我们可以做得更好。

解决方案:流API

最后,我想到了这个实用程序:

void doInParallelNTimes(int times, Runnable op) {IntStream.range(0, times).parallel().forEach(i -> op.run());
}

可重复使用的一切。 像这样称呼它:

doInParallelNTimes(5, () -> System.out.println(Thread.currentThread()));

做完了

这打印出以下内容。 请注意,它实际上也在使用主线程,因为它无论如何都会被扣为人质,直到执行完成后才能恢复。

Thread[main,5,main]
Thread[ForkJoinPool.commonPool-worker-1,5,main]
Thread[main,5,main]
Thread[ForkJoinPool.commonPool-worker-3,5,main]
Thread[ForkJoinPool.commonPool-worker-2,5,main]

另一个例子:并行计算

这是另一个例子。 我们可以使用流API并行处理许多不同的任务,而不必重复N次相同的事情。 我们可以创建(“种子”)具有任何集合或值集的流,对其并行执行一个函数,最后汇总结果(集合为一个集合,减少为单个值等)。

让我们看看如何计算前45个斐波纳契数的总和:

public class Tester {public static void main(String[] args) {Stopwatch stopwatch = Stopwatch.createStarted();IntStream.range(1, 45).parallel().map(Tester::fib).sum();System.out.println("Parallel took " + stopwatch.elapsed(MILLISECONDS) + " ms");stopwatch.reset();stopwatch.start();IntStream.range(1, 45).map(Tester::fib).sum();System.out.println("Sequential took " + stopwatch.elapsed(MILLISECONDS) + " ms");}private static int fib(int n) {if (n == 1 || n == 2) {return 1;} else {return fib(n - 1) + fib(n - 2);}}
}

打印输出:

Parallel took 3078 ms
Sequential took 7327 ms

它在一行代码中实现了很多。 首先,它创建一个流,其中包含我们要并行运行的所有任务的描述。 然后,它并行调用所有这些函数。 最后,它返回所有这些结果的总和。

并非所有人为。 我可以轻松想象创建具有任意值(包括丰富的Java对象)的流,并对它们执行非平凡的操作。 没关系,编排所有看起来仍然相同的东西。

什么时候做?

我认为这种解决方案在所有情况下都非常有用,当您事先知道负载,并且您希望将执行分叉到多个线程并在它们全部完成后恢复。 我需要一些测试代码,但是它可能在许多其他派生/合并或分而治之方案中很好地工作。

显然,如果您想在后台运行某些程序并恢复执行,或者想让后台执行程序长时间运行,则无法使用。

翻译自: https://www.javacodegeeks.com/2015/01/java-8-streams-api-as-friendly-forkjoinpool-facade.html

java8 streams

java8 streams_Java 8 Streams API作为友好的ForkJoinPool外观相关推荐

  1. Java 8 Streams API作为友好的ForkJoinPool外观

    我最喜欢Java 8的功能之一是流API. 最终,它消除了代码中的几乎所有循环,并使您可以编写更具表现力和重点的代码. 今天,我意识到它可以用于其他用途:作为ForkJoinPool一个不错的前端. ...

  2. java8 streams_Java 8 Streams API:对流进行分组和分区

    java8 streams 这篇文章展示了如何使用Streams API中可用的Collectors将具有groupingBy的流元素和具有partitioningBy的流元素进行groupingBy ...

  3. java8 streams_Java 8 Streams:过滤和谓词否定

    java8 streams 最近,有关LJC 邮件列表的成员在流中.filter方法中使用谓词否定的有趣讨论,因此我认为值得在博客文章中进行总结. 讨论是关于使用.filter和否定谓词的方法. 这篇 ...

  4. java8 streams_Java 8 Friday:使用Streams API时的10个细微错误

    java8 streams 在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. ...

  5. 一点杂感 以及 java8 Streams API 与 C# Linq 简要对比分析

    写在前面的一点小吐槽.一点杂感 学 Haskell 学了一段时间之后,虽说拿他来写东西还是完全不行,但是看别的语言特性时,总是会带着一种"诶,这玩意在哪哪见过"的蜜汁既视感.且不说 ...

  6. java8 streams_当Java 8 Streams API不够用时

    java8 streams Java 8与往常一样是妥协和向后兼容的版本. JSR-335专家组可能尚未与某些读者就某些功能的范围或可行性达成一致的版本 . 请参阅Brian Goetz关于为什么-的 ...

  7. 当Java 8 Streams API不够用时

    Java 8与往常一样是妥协和向后兼容的版本. JSR-335专家组可能无法与某些读者就某些功能的范围或可行性达成一致的发行版. 请参阅Brian Goetz关于为什么-的一些具体解释. -Java ...

  8. java streams_使用JShell的Java 9 Streams API

    java streams 这篇文章着眼于使用JShell的Java 9 Streams API. Streams API的更改以Java 8中Streams的成功为基础,并引入了许多实用程序方法– t ...

  9. 使用JShell的Java 9 Streams API

    这篇文章着眼于使用JShell的Java 9 Streams API. Streams API的更改以Java 8中Streams的成功为基础,并引入了许多实用程序方法– takeWhile,drop ...

最新文章

  1. 一文全面了解基于内容的推荐算法
  2. 动态绑定 dgvlist 列
  3. MySQL — 外键关联操作
  4. eclipse lombok插件安装_如果你是Java架构师或项目经理,项目技术会允许使用Lombok吗?
  5. [异能程序员]第五章 出手(第一更)
  6. ERRORS: ?: (admin.E408) 'django.contrib.auth.middleware.AuthenticationMiddleware' must be in MIDDLEW
  7. 通过IDE生成和手动call调用webservice
  8. win7内存占用过高怎么处理
  9. 2020年中国基层医疗研究报告
  10. SAP License:ERP项目经理需求调研的惨痛经历
  11. 括号匹配,实现简单计算器(加减乘除,小括号)
  12. EDID是什么,跟显示器有什么关系?
  13. 使用Arduino和四位数码管实现数字时钟
  14. 从输入/输出的视角看TCP/IP(终端,shell以及X Window)
  15. Vue中音乐播放器的使用
  16. 数据集转换成LMDB格式
  17. CSS文字溢出省略号,单行省略号,多行省略号
  18. 垄断的需求弹性_6μm 锂电铜箔迈入需求持续高增长周期
  19. 关于海外服务器时间和网站时差问题解决方案
  20. 什么是CISP-PTE认证?

热门文章

  1. YbtOJ#20082-[NOIP2020模拟赛B组Day8]导出子图【dp】
  2. 数学基础知识(高精、快速幂、龟速乘……)
  3. 【贪心】雷达装置(ybtoj 贪心-1-2)
  4. NOIP2019 Emiya家今天的饭
  5. 汇编语言(三)之判断数值是否大于42H并统计个数
  6. MySQL sysdate()函数
  7. 2017派卧底去阿里、京东、美团、滴滴带回来的面试题
  8. javafx之TableView的FXCSS
  9. Boostrap技能点整理之【网格系统】
  10. 优秀学生专栏——董超