fork join框架使用_Java:使用Fork / Join框架的Mergesort

fork join框架使用

此项的目的是显示一个Fork / Join RecursiveAction的简单示例,而不是过多地探讨合并排序的可能优化方法,或者比使用Exkutor / Join Pool优于现有的基于Java 6的现有实现(如ExecutorService)的相对优势。

以下是使用Java的自上而下合并排序算法的典型实现:

import java.lang.reflect.Array;public class MergeSort {public static <T extends Comparable<? super T>> void sort(T[] a) {@SuppressWarnings('unchecked')T[] helper = (T[])Array.newInstance(a[0].getClass() , a.length);mergesort(a, helper, 0, a.length-1);}private static <T extends Comparable<? super T>> void mergesort(T[] a, T[] helper, int lo, int hi){if (lo>=hi) return;int mid = lo + (hi-lo)/2;mergesort(a, helper, lo, mid);mergesort(a, helper, mid+1, hi);merge(a, helper, lo, mid, hi);  }private static <T extends Comparable<? super T>> void merge(T[] a, T[] helper, int lo, int mid, int hi){for (int i=lo;i<=hi;i++){helper[i]=a[i];}int i=lo,j=mid+1;for(int k=lo;k<=hi;k++){if (i>mid){a[k]=helper[j++];}else if (j>hi){a[k]=helper[i++];}else if(isLess(helper[i], helper[j])){a[k]=helper[i++];}else{a[k]=helper[j++];}}}private static <T extends Comparable<? super T>> boolean isLess(T a, T b) {return a.compareTo(b) < 0;}
}

为了快速描述算法-
递归执行以下步骤:

  1. 输入数据分为两半
  2. 每一半都被排序
  3. 然后将排序的数据合并

合并排序是使用Java Fork / Join池实现的一个典型示例 ,以下是使用Fork / Join框架进行合并排序的盲目实现:

合并排序中的递归任务可以简单地表示为RecursiveAction的实现–

private static class MergeSortTask<T extends Comparable<? super T>> extends RecursiveAction{private static final long serialVersionUID = -749935388568367268L;private final T[] a;private final T[] helper;private final int lo;private final int hi;public MergeSortTask(T[] a, T[] helper, int lo, int hi){this.a = a;this.helper = helper;this.lo = lo;this.hi = hi;}@Overrideprotected void compute() {if (lo>=hi) return;int mid = lo + (hi-lo)/2;MergeSortTask<T> left = new MergeSortTask<>(a, helper, lo, mid);MergeSortTask<T> right = new MergeSortTask<>(a, helper, mid+1, hi);invokeAll(left, right);merge(this.a, this.helper, this.lo, mid, this.hi);}private void merge(T[] a, T[] helper, int lo, int mid, int hi){for (int i=lo;i<=hi;i++){helper[i]=a[i];}int i=lo,j=mid+1;for(int k=lo;k<=hi;k++){if (i>mid){a[k]=helper[j++];}else if (j>hi){a[k]=helper[i++];}else if(isLess(helper[i], helper[j])){a[k]=helper[i++];}else{a[k]=helper[j++];}}}private boolean isLess(T a, T b) {return a.compareTo(b) < 0;}}

上面的MergeSortTask实现了一个计算方法,该方法接受一个值数组,将其分成两个部分,从每个部分中创建一个MergeSortTask并分叉另外两个任务(因此称为RecursiveAction!)。 此处用于生成任务的特定API是invokeAll ,仅当已提交的子任务标记为已完成时才返回。 因此,左右子任务返回后,结果将合并到合并例程中。

鉴于此,剩下的唯一工作就是使用ForkJoinPool提交此任务。 ForkJoinPool与用于在线程池中分发任务的ExecutorService类似,不同之处在于引用了ForkJoinPool的API文档:

ForkJoinPool与其他类型的ExecutorService的不同之处主要在于采用了工作窃取:池中的所有线程都试图查找并执行由其他活动任务创建的子任务(如果不存在,则最终阻塞等待工作)

这是将任务提交到Fork / Join Pool的任务的样子:

public static <T extends Comparable<? super T>> void sort(T[] a) {@SuppressWarnings('unchecked')T[] helper = (T[])Array.newInstance(a[0].getClass() , a.length);ForkJoinPool forkJoinPool = new ForkJoinPool(10);forkJoinPool.invoke(new MergeSortTask<T>(a, helper, 0, a.length-1));}

完整的示例也可以在这里找到: https : //github.com/bijukunjummen/algos/blob/master/src/main/java/org/bk/algo/sort/algo04/merge/MergeSortForkJoin.java

参考: all和其他博客中的Mergesort 使用我们JCG合作伙伴 Biju Kunjummen的Fork / Join Framework 。


翻译自: https://www.javacodegeeks.com/2012/08/java-mergesort-using-forkjoin-framework.html

fork join框架使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java最大公约数和最小公倍数的求法(辗转相除法)

这道题计算了三个数的最小公倍数 1 import java.util.Scanner;2 3 public class D {4 public static int gcd(int a,int b) {5 int max a>b?a:b;6 int min a<b?a:b;7 if(max%min ! 0) {8 return gcd(min,max%min);9 …

html隐藏块元素过度动画,CSS3实现DIV图层隐藏到显示的过渡效果

本文介绍CSS3实现DIV图层隐藏到显示的过渡效果&#xff0c;可用于产品列表的产品简介过渡显示与隐藏等&#xff0c;希望对你有所帮助。CSS3的transition过渡属性对于页面元素的显隐并没有提供过渡方法&#xff01;所以DIV图层从display&#xff1a;none到display&#xff1a;bl…

Java 8:在2分钟内将智能流与数据库一起使用

快速流媒体 当Java 8最终问世时&#xff0c;我和一些大学开始了一个开源项目&#xff0c;以利用Java 8的流库使整个Java / DB问题进一步向前发展&#xff0c;以便将数据库表视为纯Java 8流。 速度诞生了&#xff01; 哇&#xff0c;现在我们可以做类型安全的数据库应用程序了&a…

MapReduce 详解

MapReduce的整个运行分为两个阶段&#xff1a; Map和Reduce Map阶段由一定数量的Map Task组成 输入格式的数据格式化&#xff1a;InputFormat 数日数据的处理:Mapper 数据分组&#xff1a;Partitioner 下面流程图&#xff1a; 1. Map task 首先从HDFS上Read文件&#xff0c;通过…

16福师计算机应用基础在线作业,16春季福师《计算机应用基础》在线作业二.doc...

16春季福师《计算机应用基础》在线作业二福师《计算机应用基础》在线作业二一、单选题(共 40 道试题&#xff0c;共 80 分。)1. ( )都是系统软件。. OS 和MIS. WPS和UNIX. UNIX和Wor. OS和UNIX正确答案&#xff1a;2. 在幻灯片浏览视图中&#xff0c;下列( )操作不能实现。. 复…

早期访问中具有NetBeans的Oracle公共云Java服务

谁期望发生这种情况&#xff1a;Oracle正在开发公共云产品&#xff0c;并且即将开始正式启动的迹象已经出现。 在正式宣布之后将近一年&#xff0c;我被邀请加入所谓的“抢先体验”计划&#xff0c;以试驾新服务并提供反馈。 多亏负责产品的经理Reza Shafii &#xff0c;我才可…

如何解析C语言的声明

一个声明&#xff1a;int *p[] 分为四部分&#xff1a; &#xff08;1&#xff09;p &#xff08;2&#xff09;p右面的符号&#xff08;可以什么都没有&#xff09; &#xff08;3&#xff09;p左面的符号&#xff08;可以什么都没有&#xff09; &#xff08;4&#xff09;最…

HTML5调整图像垂直边距,77.通过vspace和hspace属性可以分别调整图像的垂直边距和水平边距。()()...

具有东方建筑特色、&#xff0e;通图像规模宏大、气势雄伟的古代建筑群是( )属性水平完成规定的大作业分别Which of the following parks are the urban parks of New York?调整的垂Which of the following countries have once occupied New York city in the 17th century?…

JLBH示例1 –为什么应在上下文中对代码进行基准测试

在这篇文章中&#xff1a; 使用JMH和JLBH进行日期序列化的并排示例 在微基准中测量日期序列化 测量日期序列化作为适当应用程序的一部分 如何为您的JLBH基准添加探针 了解在上下文中衡量代码的重要性 在上一篇文章“ JLBH简介 ”中&#xff0c;我们介绍了JLBH&#xff08…

Javac可以编译,Java显示找不到或无法加载主类

运行时候加入完整包名。转载于:https://www.cnblogs.com/theWinter/p/8594354.html

计算机科学技术专业发展分析,计算机科学与技术发展现况分析

摘要&#xff1a;在这个科技突飞猛进发展的时代&#xff0c;计算机网络已经家喻户晓&#xff0c;在日常生活中也起着不可忽视的作用&#xff0c;计算机的发展提高了人们的生活质量&#xff0c;加快了信息的传播&#xff0c;现如今&#xff0c;各个国家都比较重视计算机科学与技…

Linux中拷贝和移动文件

拷贝和移动文件 序号 命令 对应英文 作用 01 tree [目录名] tree 以树状图列出文件目录结构 02 cp 源文件 目标文件 copy 复制文件或目录 03 mv 源文件 目标文件 move 移动文件或者目录 / 文件或者目录重命名 tree tree 命令可以以树状图列出文件目录结构 选项 …

计算机网络中对等层,【计算机网络】两个网络模型——OSI参考模型和TCP/IP模型...

计算机网络 两个网络模型计算机网络模型分层机制----规划通讯细节层与层之间之间是独立的、屏蔽的&#xff0c;下层为上层提供服务。一些概念实体&#xff1a;任何发送/接收信息的软件/硬件进程。对等层&#xff1a;两个不同系统的同级层次。对等实体&#xff1a;位于不同系统中…

aspect spring_使用Aspect和Spring Profile进行电子邮件过滤

aspect spring在Web应用程序开发期间&#xff0c;经常需要发送电子邮件。 但是&#xff0c;有时数据库中会包含来自生产的数据&#xff0c;并且存在在电子邮件测试执行期间向真实客户发送电子邮件的风险。 这篇文章将解释如何避免在没有在发送电子邮件功能中明确编写代码的情况…

SQL FOREIGN KEY 约束

SQL Primary KeySQL CheckSQL FOREIGN KEY 约束 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。 让我们通过一个例子来解释外键。请看下面两个表&#xff1a; "Persons" 表&#xff1a; Id_PLastNameFirstNameAddressCity1AdamsJohnOxford StreetLondon2Bus…

台式计算机欢迎界面下不去,Win7系统开机不显示欢迎界面的方法

现在办公人员做事情都讲究效率&#xff0c;甚至连电脑开机都不放过&#xff0c;win7系统加快开机速度的方法有很多种&#xff0c;开机不显示欢迎界面便是其中之一。有些用户觉得开机显示欢迎界面是非常浪费时间的一件事&#xff0c;想要删除电脑中的欢迎界面。但是很多电脑白不…

CompressedOops:Java压缩参考简介

在本文中&#xff0c;我们将向您介绍一种称为Compressed oops的JVM优化。 压缩oop的概念是由32位和64位体系结构之间的差异引起的。 因此&#xff0c;我们将对64位体系结构进行简短的回顾&#xff0c;然后再深入探讨压缩oop的主题。 最后&#xff0c;我们将通过一个简单的示例看…

CentOS7桌面版系统使用的一些小技巧

1、 清空~/.kde/ 文件下的文件&#xff0c;登陆后不显示桌面的解决方法 在使用CentOS7 桌面系统时&#xff0c;有时候打开文件会很卡。这时我们需要清空当前用户下的 .kde 文件下的所有文件。 再重新登陆该用户时&#xff0c;会发现桌面上的图标都不显示了。 首先查看一下系统语…

计算机网络流量图阅读与理解,计算机网络流量监控的设计与实现

摘要&#xff1a;网络管理的重要工作是进行实时网络监控,网络监控主要是进行网络流量,状态,行为信息的采集,将采集的信息进行统计和分析,得到网络的流量状态数据,采集的网络流量信息包括了动态信息和静态信息两部分,本文在此基础上,进行了网络流量监控管理系统的研究. 本文首先…

阿里一面经验总结

今天的面试很突然&#xff0c;中午十一点收到电话通知&#xff0c;下午五点面试&#xff0c;之前毫无准备【以后要坚决杜绝这种情况】&#xff0c;一共六个小时&#xff0c;可以说是特别紧张的&#xff0c;从挂断电话就一直坐卧不安&#xff0c;主要还是没复习心里没底&#xf…