Java 中的线程并行编程

Parallel programming with threads in Java

Parallel programming was possible in Java only from Java 7 with the advent of Join/Fork framework.

假设在 Java 中,使用 ExecutorService 我创建了一个包含 4 个线程的线程池并向其提交 10 个任务,这意味着 4 个线程将开始执行 4 个任务和其他 6 个任务将在任何线程完成其任务时被线程拾取。

假设我有一个具有 4 个内核的四核处理器,我知道一个线程可以 运行 在单个内核上(这里不采用超线程概念)所以我的所有 4 个线程都将并行工作, 1 个线程 运行ning 在 1 个核心上?不就是并行编程吗?

编辑: Source of reading - 这是 Java 8 播放列表,在第 1 章中提到可以从 Java 7起。

你这边理解有误

I read that parallel programming was possible in Java only from Java 7 with the advent of Join/Fork framework.

这是错误的。 Join/Fork 语句只是 另一个 抽象层,与 "bare metal" 线程相比,它为您提供了更强大的概念。

Isn't it a parallel programming?

您已经清楚地概述了您的任务将进入一个支持 4 个线程的池;并且您的硬件也应该支持 4 个线程。所以这项工作将并行进行。请注意:Fork/JoinExecutorService not 相同。相反,两者都是先进的概念;旨在让您 "parallel programming" 更轻松。

在简要收听问题中链接的视频后:教程是关于 Java8 添加 流的事实,最重要的是 parallel streams(它使用下面的 Fork/Join 框架——那个是在 Java 7 中引入的)。

无论如何,该视频强调并行程序比 Java 的早期版本 更简单 。因此,这根本不是要引入以前不可能实现的东西 - 而是要提供新的更多强大的抽象,使更容易这样做东西。

Parallel programming was possible in Java only from Java 7 with the advent of Join/Fork framework.

java 自早期版本以来就存在并行编程。 Java 5 java.util.concurrent 包 类 和 Java 7 ForkJoinPool 进一步增强了并行编程到新的水平。

您可以在这个 article by oracle 中找到问题的答案。

Java 平台标准版 (Java SE) 5 然后 Java SE 6 引入了一组提供强大 并发性的包 积木。 Java SE 7 通过添加对 并行性

的支持进一步增强了它们

分治问题示例:

求大数组中整数的总和

不是顺序计算总和,而是将数组分成多个分区,并将每个分区上的计算任务分配给不同的任务。

执行分治算法的问题与创建子任务无关,因为Callable可以自由地向其执行者提交新的子任务并等待其结果以同步或异步方式

问题是并行性:当一个Callable等待另一个Callable的结果时,它被置于等待状态,因此浪费了处理另一个 Callable 排队等待执行的机会。

fork/join框架添加到java.util.concurrent包中Java SE 7

支持并行性的添加:

核心添加是一个新的 ForkJoinPool 执行器,它专用于 运行ning 实施 ForkJoinTask 的实例。 ForkJoinTask 对象支持创建子任务并等待子任务完成。有了这些清晰的语义,当一个任务正在等待另一个任务完成并且有待处理的任务窃取”作业时,执行器能够在其内部线程池中调度任务=93=].

ForkJoinTask 对象具有两个特定方法:

fork() 方法允许计划一个 ForkJoinTask 异步执行。这允许从现有的 ForkJoinTask 启动新的

反过来,join() 方法允许一个 ForkJoinTask 等待另一个完成。