使用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等待另一个完成。

在这里输入图像描述

链接地址: http://www.djcxy.com/p/79305.html

上一篇: Parallel programming with threads in Java

下一篇: Concurrency is not Parallelism?