首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java线程进行并行编程

用Java线程进行并行编程
EN

Stack Overflow用户
提问于 2017-07-04 09:15:27
回答 2查看 2.8K关注 0票数 3

随着Join/Fork framework的出现,Java中只有Java 7才有可能进行并行编程。

假设在Java中,使用ExecutorService,我创建了一个线程池,比如4个线程,然后向它提交10个任务,这意味着4个线程将开始执行这4个任务,而其他6个任务将在任何线程完成其任务时被线程捕获。

让我们假设我有一个具有4个内核的四处理器,我知道一个线程可以在单个内核上运行(这里不考虑超线程概念),那么我所有的4个线程是否都能并行工作,一个线程运行在一个内核上?这不是一个并行编程吗?

编辑: 阅读来源 --这是Java8播放列表,在第1章中提到,从Java7开始就可以进行并行编程。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-04 09:18:56

你的头上有一种误解。

我读到,随着Join/Fork框架的出现,Java中只有Java 7才有可能进行并行编程。

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

这不是一个并行编程吗?

您已经清楚地描述了您的任务将进入一个支持4个线程的池中;您的硬件也应该支持4个线程。所以这项工作将并行进行。请不要:叉/联接与ExecutorService不一样。相反,这两个概念都是高级概念,目的是使“并行编程”更容易。

在简要听取了问题中链接的视频之后:本教程讲述的是Java8添加了流的事实,以及在并行流之上添加流(它使用下面的Fork/Join框架--这是Java7引入的)。

无论如何,该视频强调,与早期版本的相比,并行程序的要简单得多。所以,这根本不是要引入以前不可能的东西,而是要提供新的、更强大的抽象,使做这些事情更容易。

票数 8
EN

Stack Overflow用户

发布于 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等待另一个方法的完成。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44901843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档