使用Java中的线程进行并行编程
随着Join/Fork framework
的出现,Java中只有Java 7才能实现并行编程。
比方说在Java中,使用ExecutorService
我创建了一个说4线程的线程池,并提交给它说10个任务,这意味着4个线程将开始执行4个任务,其他6个任务将被线程挑选出来,当任何线程完成时任务。
假设我有一个有4个内核的四核处理器,我知道一个线程可以在单核上运行(这里没有考虑超线程的概念),所以我的4个线程并行工作,1个线程运行在1个核心上? 这不是一个并行编程吗?
编辑:阅读的来源 - 这是Java 8的播放列表,在第1章中提到并行编程可能从Java 7开始。
你的目标存在误解。
我读到了Java中只有Java 7才能使用并行编程,而Join / Fork框架的出现。
那是错的。 Join / Fork语句只是另一个抽象层,与“裸机”线程相比,它为您提供更强大的工作概念。
这不是一个并行编程吗?
您清楚地概述了您的任务将进入支持4个线程的池; 并且你的硬件也应该支持4个线程。 所以这项工作将同时进行。 请不要:Fork / Join与ExecutorService不一样。 相反,两者都是先进的概念; 旨在使“并行编程”更容易。
简单地听一下问题链接的视频后:本教程讲述了Java8添加流的事实,以及并行流(使用底下的Fork / Join框架 - 这是Java 7引入的)的事实。
无论如何,该视频强调,与早期版本的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包中
增加支持并行性:
核心增加了一个新的ForkJoinPool
执行器,专门用于运行实现ForkJoinTask的实例。 ForkJoinTask
对象支持创建子任务以及等待子任务完成。 通过这些清晰的语义,当任务等待另一个任务完成并且有待执行的任务运行时,执行程序能够通过“ 窃取 ”作业在其内部线程池中分派任务。
ForkJoinTask对象具有两种特定的方法:
fork()
方法允许为异步执行计划ForkJoinTask
。 这允许从现有的ForkJoinTask
启动新的ForkJoinTask
。
反过来, join()
方法允许ForkJoinTask
等待另一个完成。