在Java中使用线程进行并行编程
随着
Join/Fork framework
的出现,Java中只能从Java 7进行并行编程。
让我们说在Java中,使用ExecutorService
我创建一个4线程的线程池并提交给它说10个任务,这意味着4个线程将开始执行4个任务,其他6个任务将由线程获取,当任何线程完成其任务。
假设我有一个具有4个内核的四核处理器,我知道一个线程可以在一个内核上运行(这里不采用超线程概念)所以我的所有4个线程并行工作,1个内核运行1个线程? 这不是一个并行编程吗?
编辑: 读取源 – 这是Java 8播放列表,在第1章中提到可以从Java 7开始实现并行编程。
你的结局存在误解。
我读到,随着Join / Fork框架的出现,只能从Java 7开始在Java中实现并行编程。
那是错的。 Join / Fork语句只是另一个抽象层,它为您提供了更强大的概念 – 与“裸机”线程相比。
这不是一个并行编程吗?
您已清楚地概述了您的任务将进入支持4个线程的池中; 并且您的硬件也应该支持4个线程。 这样的工作将同时进行。 请不要: Fork / Join与ExecutorService不同 。 相反,两者都是先进的概念; 旨在使您更容易“并行编程”。
在简要回听了问题中链接的video之后:该教程是关于Java8 添加流的事实,并且在并行流之上(使用下面的Fork / Join框架 – 这是Java 7引入的)。
无论如何,该video强调与早期版本的Java相比,并行程序变得更加 简单 。 所以它根本不是介绍以前不可能的东西 – 而是提供新的更强大的抽象,使得更容易做这些事情。
随着Join / Fork框架的出现,Java中只能从Java 7进行并行编程。
从早期版本开始,Java中就存在并行编程。 它使用Java 5 java.util.concurrent包类进行了增强,Java 7 ForkJoinPool进一步增强了并行编程到新的水平。
您可以在本文中通过oracle找到您的问题的答案。
Java平台,标准版(Java SE)5和Java SE 6引入了一组包,提供了强大的并发构建块。 Java SE 7通过添加对并行性的支持进一步增强了它们
分而治之问题的例子:
查找大数组中的整数之和
不是顺序计算总和,而是将数组划分为多个分区,并将每个分区上的计算任务分配给不同的任务。
执行分而治之算法的执行程序的问题与创建子任务无关,因为Callable
可以自由地向其执行程序提交新的子任务并以同步或异步方式等待其结果 。
问题在于并行性:当Callable
等待另一个Callable
的结果时,它处于等待状态,因此浪费了处理排队等待执行的另一个Callable
的机会。
fork / join框架添加到Java SE 7中的java.util.concurrent包中
支持并行的附加function:
核心添加是一个新的ForkJoinPool
执行器,专门用于运行实现ForkJoinTask的实例。 ForkJoinTask
对象支持创建子任务以及等待子任务完成。 使用这些明确的语义,执行程序能够在任务等待另一个任务完成并且有待执行的任务运行时通过“ 窃取 ”作业在其内部线程池中调度任务。
ForkJoinTask对象具有两种特定方法:
fork()
方法允许计划ForkJoinTask
进行异步执行。 这允许从现有的ForkJoinTask
启动新的ForkJoinTask
。
反过来, join()
方法允许ForkJoinTask
等待另一个完成。