Java中使用线程进行并行编程

3
在Java中,只有从Java 7开始使用Join/Fork框架,才可以进行并行编程。假设我在Java中使用ExecutorService创建一个线程池,其中包含4个线程,并向其提交10个任务,这意味着4个线程将开始执行4个任务,其他6个任务将在任何线程完成其任务时由线程接管。假设我有一个四核处理器,我知道一个线程可以在单个核上运行(不考虑超线程概念),那么我的4个线程会同时工作吗?每个线程在1个核上运行,这不是并行编程吗?编辑:阅读来源-这是Java 8播放列表,在第1章中提到从Java 7开始可以进行并行编程。

1
我了解到并行编程在Java中只从Java 7开始使用Join/Fork框架之后才成为可能。但这是错误的。自Java 1.0版本以来,你就可以使用线程进行并行编程了。这个框架只是使事情更加易于使用而已。 - f1sh
如果您对答案不满意,可能需要提供您阅读的来源。这将使其他人更容易提供完整上下文的答案。 - Sabir Khan
还要注意,您可以通过编程方式找出核心数:https://dev59.com/Qm445IYBdhLWcg3wpb4P(有时人们会+1或-1) - Christophe Roussy
2个回答

8

你有一个误解。

我读到说,在Java 7中才有了Join/Fork框架,只有从那时开始才能进行并行编程。

这是错误的。Join/Fork语句只是又一个抽象层,它为您提供了比“裸线程”更强大的概念。

难道不是并行编程吗?

您已经清楚地概述了任务将进入一个支持4个线程的池,并且您的硬件也应该支持4个线程。因此,该工作将并行进行。请注意:Fork/JoinExecutorService不同。相反,两者都是高级概念,旨在使“并行编程”更轻松。

在简短地听取了问题中链接的视频之后:教程介绍了Java8添加了流,以及在此基础上并行流(在其下使用Fork/Join框架 - 此框架是在Java 7中引入的)。

无论如何,该视频强调相比于Java早期版本,使用并行程序变得简单得多。因此,它根本不是介绍以前不可能做到的事情,而是提供了新的强大的抽象层,使其更容易实现这些功能。


我已经发布了我得到这个错误信息的链接。所以为了保持一致,我上面提到的在4核处理器上使用4个线程执行10个任务的示例是并行编程。对吗? - Anand
你能再具体一点吗?第一个视频,5分钟后,10分钟后,15分钟后,还是其他时间? - GhostCat
ForkJoinPool是Fork/Join框架的一部分,它本质上就是一个ExecutorService。创建四个线程在四个核心上执行是实现并行执行的最佳方式,但是不能保证线程一定会以这种方式执行... - Holger

3

Java 7引入Join/Fork框架后才能实现并行编程。

早期版本的Java中已经存在并行编程。Java 5的java.util.concurrent包类和Java 7的ForkJoinPool进一步提升了并行编程的水平。

您可以在Oracle的文章中找到问题的答案。

Java Platform,Standard Edition(Java SE)5,然后Java SE 6引入了一组提供强大的并发构建块的包。 Java SE 7通过添加对并行性的支持进一步增强了它们。

分而治之问题的示例:

查找大数组中整数的总和

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

enter image description here

问题在于实现分治算法的执行器并不涉及创建子任务,因为 Callable 可以自由地向其执行器提交新的子任务,并以同步或异步方式等待其结果。问题在于并行性:当 Callable 等待另一个 Callable 的结果时,它处于等待状态,因此浪费了处理另一个已排队执行的 Callable 的机会。
Java SE 7 中添加了 fork/join 框架以支持并行处理。其中核心是新增了一个专用于运行实现 ForkJoinTask 的实例的 ForkJoinPool 执行器。ForkJoinTask 对象支持创建子任务并等待子任务完成。有了这些清晰的语义,执行器能够通过“窃取”任务来将任务分配给其内部线程池,当一个任务正在等待另一个任务完成且有待处理的任务时,就会发生这种情况。ForkJoinTask 对象具有两个特定的方法: < p > fork() 方法允许异步执行计划的 ForkJoinTask。这允许从现有任务启动新的 ForkJoinTask

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

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接