随着
Join/Fork framework的出现,Java中只有Java 7才有可能进行并行编程。
假设在Java中,使用ExecutorService,我创建了一个线程池,比如4个线程,然后向它提交10个任务,这意味着4个线程将开始执行这4个任务,而其他6个任务将在任何线程完成其任务时被线程捕获。
让我们假设我有一个具有4个内核的四处理器,我知道一个线程可以在单个内核上运行(这里不考虑超线程概念),那么我所有的4个线程是否都能并行工作,一个线程运行在一个内核上?这不是一个并行编程吗?
编辑: 阅读来源 --这是Java8播放列表,在第1章中提到,从Java7开始就可以进行并行编程。
发布于 2017-07-04 09:18:56
你的头上有一种误解。
我读到,随着Join/Fork框架的出现,Java中只有Java 7才有可能进行并行编程。
这是不对的。Join/Fork语句只是另一个抽象层,它为您提供了比“裸金属”线程更强大的概念。
这不是一个并行编程吗?
您已经清楚地描述了您的任务将进入一个支持4个线程的池中;您的硬件也应该支持4个线程。所以这项工作将并行进行。请不要:叉/联接与ExecutorService不一样。相反,这两个概念都是高级概念,目的是使“并行编程”更容易。
在简要听取了问题中链接的视频之后:本教程讲述的是Java8添加了流的事实,以及在并行流之上添加流(它使用下面的Fork/Join框架--这是Java7引入的)。
无论如何,该视频强调,与早期版本的相比,并行程序的要简单得多。所以,这根本不是要引入以前不可能的东西,而是要提供新的、更强大的抽象,使做这些事情更容易。
发布于 2017-07-04 11:45:20
随着Join/Fork框架的出现,Java中只有Java 7才有可能进行并行编程。
自早期版本以来,java中就存在并行编程。使用Java5 java.util.concurrent包类对其进行了增强,Java7 ForkJoinPool进一步将并行编程提高到了新的水平。
你可以通过甲骨文在这个文章中找到你问题的答案。
Java,Standard (Java )5,然后Java 6引入了一组提供强大的并发构建块的包。Java 7通过增加对并行性的支持,进一步增强了它们
分而治之问题的例子:
在大数组中求整数和
与其按顺序计算和,不如将数组划分为多个分区,并将每个分区上的计算任务分配给不同的任务。

执行器用于实现分治算法的问题与创建子任务无关,因为Callable可以自由地向其执行器提交一个新的子任务,并以同步或异步的方式等待其结果。
问题是并行性问题:当Callable等待另一个Callable的结果时,它处于等待状态,从而浪费了处理排队执行的另一个Callable的机会。
在Java 7中添加到java.util.concurrent包中的叉/join框架
支持并行性的添加:
核心添加是一个新的ForkJoinPool执行器,专门用于运行实现ForkJoinTask的实例。ForkJoinTask对象支持创建子任务,并等待子任务完成。有了这些清晰的语义,当一个任务等待另一个任务完成时,当有挂起的任务要运行时,执行器就能够通过“ task ”作业在其内部线程池中分配任务。
ForkJoinTask对象具有两种特定的方法:
fork()方法允许计划用于异步执行的ForkJoinTask。这允许从现有的ForkJoinTask启动一个新的one。
反过来,join()方法允许ForkJoinTask等待另一个方法的完成。

https://stackoverflow.com/questions/44901843
复制相似问题