Java 7:满足Fork / Join框架

JSR-166(y)是Java 7中包含的此新功能的正式名称。如果您发现名称中有一个“ y”,这是因为自Java 5起就添加了JSR-166(并发实用程序) ,但它不会就此停止,因为已经有计划在JSR-166(e)下在Java 8中添加新类。 检查此页面,由JSR-166的创建者Doug Lea维护,以获取更多信息。

根据Wikipedia的说法, 并行性是“在多个处理器上同时执行已编程指令和数据的多个实例的某种组合”,并且Java从第1天起就有类和接口来实现此目的(有点……)。您可能将它们称为: java .lang.Thread , java.lang.Runnable等…并发实用程序( java.util.concurrent包)的作用是简化并发任务的编码方式,因此我们的代码更加简单和简洁。 作为开发人员,在具有更高处理资源的计算机上运行应用程序时,我们无需执行任何操作,显然,我们的应用程序性能会提高,但是我们是否真的在最大限度地利用处理资源? 答案是否定的。

这篇文章将向您展示在处理可分为小问题的问题时,Fork / Join框架将如何最大程度地帮助我们使用处理资源,并且解决这些小问题中的每一个的所有解决方案都将产生大问题的解决方案问题(例如递归,分而治之)。

你需要什么

NetBeans 7+或任何其他支持Java 7 JDK 7+的 IDE
图像模糊 ,来自Oracle的示例

基础

Fork / Join框架专注于使用计算机中可用的所有处理资源来提高应用程序的性能。 它旨在简化Divide and Conquer算法中的并行性。 Fork / Join框架背后的魔力在于其工作窃取算法,该算法中的工作线程可以从其他繁忙线程中自由窃取任务,因此所有线程始终都在工作。 以下是开始使用框架时应了解的基础知识:

  • Fork意味着将任务分为子任务并进行处理。
  • 联接意味着将每个子任务的解决方案合并为一个通用解决方案。
  • java.lang.Runtime使用此类来获取可用于Java虚拟机的处理器数量。 为此,请使用方法+ availableProcessors():int
  • java.util.concurrent.ForkJoinPool框架的主类,是实现工作窃取算法并负责运行任务的类。
  • java.util.concurrent.ForkJoinTask抽象类,用于在java.util.concurrent.ForkJoinPool中运行的任务。 将任务理解为整个工作的一部分,例如,如果您需要在数组上做某事,则一个任务可以在位置0n / 2上工作,而另一个任务可以在位置(n / 2)+1上工作n-1 ,其中n是数组的长度。
    • java.util.concurrent.RecursiveAction抽象任务类的子类,在不需要任务返回结果时使用它,例如,当任务在数组的位置上工作时,它不返回任何内容,因为它在阵列上工作。 为了完成这项工作,您应该实现的方法是compute():void ,请注意void返回值。
    • java.util.concurrent.RecursiveTask抽象任务类的子类,当任务返回结果时使用它。 例如,在计算斐波那契数时,每个任务必须返回它计算出的数以加入它们并获得一般解。 为了完成这项工作,您应该实现的方法是compute():V ,其中V是返回值的类型; 对于Fibonacci示例, V可以是java.lang.Integer。

使用框架时,应定义一个标志,该标志指示是否有必要派生/加入任务或是否应直接计算工作。 例如,在处理数组时,可以指定如果数组的长度大于500_000_000,则应分叉/加入任务,否则,数组足够小以直接计算。 本质上,接下来应显示的算法如下:

if(the job is small enough)
{compute directly
}
else
{split the work in two pieces (fork)invoke the pieces and join the results (join)
}

好了,现在理论太多了,我们来看一个例子。

这个例子

模糊图像需要对图像的每个像素进行处理。 如果图像足够大,我们将需要处理大量像素,因此我们可以使用fork / join对它们进行处理,并最大限度地利用处理资源。 您可以从Java™Tutorials站点下载源代码。

下载源代码后,打开NetBeans IDE 7.x并创建一个新项目:

然后从显示的弹出窗口的Java类别中选择“具有现有源代码的Java项目”

选择一个名称和一个项目文件夹,然后单击下一步>

现在, 在图像示例中选择下载了Blur源代码的文件夹:

并选择文件ForkBlur.java,然后单击完成:

将导入源代码,并创建一个新项目。 请注意,新项目显示为错误,这是因为默认情况下未启用Java 7:

要解决此问题,请右键单击项目名称,然后选择选项属性 。 在弹出对话框中,转到“ 库”,然后从“ Java平台组合框”中选择“ JDK 1.7 ”:

现在,转到选项Sources并从Source / Binary Format ComboBox中选择JDK 7

最后但并非最不重要的一点是,在运行此应用程序时增加分配给虚拟机的内存,因为我们将访问500万个位置数组(或更多)。 转到选项运行并在VM Options TextBox上插入-Xms1024m -Xmx1024m

单击确定 ,您的项目应该没有错误进行编译。 现在,我们需要找到足够大的图像,以便可以处理较大的阵列。 一段时间后,由于好奇心机器人的帮助,我发现了火星上的一些很棒的图像(约150 MB),您可以从此处下载图像 。 下载图像后,将其粘贴到项目的文件夹中。

在运行示例之前,我们需要修改源代码,以便控制何时使用Fork / Join框架运行它。 在ForkBlur.java文件中,转到第104行,以更改将要使用的图像的名称:

//Change for the name of the image you pasted 
//on the project's folder.
String filename = 'red-tulips.jpg';

然后,用下面的代码替换第130至136行:

ForkBlur fb = new ForkBlur(src, 0, src.length, dst);boolean computeDirectly = true;long startTime = System.currentTimeMillis();if (computeDirectly) {fb.computeDirectly();} else {ForkJoinPool pool = new ForkJoinPool();pool.invoke(fb);}long endTime = System.currentTimeMillis();

注意computeDirectly标志。 为true时 ,我们将使用fork / Join Framework,而是直接计算任务。 如果为false,将使用fork / join框架。

ForkBlur类中的compute():void方法实现了fork / join算法。 它基于数组的长度,当数组的长度大于10_000时,将分派任务,否则将直接计算任务。

在不使用Fork / Join框架( computeDirectly = true )的情况下, 在图像示例上执行Blur时,您可以看到我的2个处理器,大约花了14 秒钟完成工作:

您可以看到处理器正在工作,但没有达到最大。 当使用Fork / Join框架( computeDirectly = false )时,您可以看到它们以100%的速度工作,并且花了将近50%的时间来完成工作:

该视频显示了完整的过程:

希望您能看到这个框架有多有用。 当然,您不能在代码中全部使用它,但是只要您有一个可以分为多个小任务的任务,那么您就知道该呼叫谁。

参考: Java 7:在Java and ME博客上, 与 JCG合作伙伴 Alexis Lopez交流Fork / Join框架 。


翻译自: https://www.javacodegeeks.com/2012/10/java-7-meet-forkjoin-framework.html

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

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

相关文章

css3总结之居中

居中在前端布局上很常见,也很常用,也是最基本的技巧。居中效果在方向控制上基本可以分解成水平居中,垂直居中和水平垂直居中。 针对调整的元素不同,具体的处理方式上有些差异。这里我们先不讲绝对定位下的居中,绝对定位…

福州java培训哪里好_南通java培训哪家好

渡课IT教育成立于2006年,14年来,我们累计输送学员达 6000 ,其中南通地区输送50%,上海 40%,其他地区 10%,学员1年后的平均薪水达 9860 元;受到1000用人单位的赞誉与支持。Java开发的需求量在北上…

研究僵局–第2部分

调查死锁时最重要的要求之一就是要研究死锁。 在我的上一个博客中,我编写了一个名为DeadlockDemo代码,该代码使用一堆线程在一系列银行帐户之间转移随机数,然后陷入僵局。 该博客运行该代码以演示获取线程转储的几种方法。 线程转储只是一个…

连锁便利店管理系统有什么用

连锁便利店管理系统对于连锁便利店的运营和管理非常有用。以下是一些常见的用途: 1. 库存管理:连锁便利店通常需要管理多个门店的库存,管理系统可以帮助实时掌握各个门店的库存情况,包括商品数量、进货记录、库存调拨等。这样可以…

浏览器打印设置横向打印_爱普生打印机无线连接设置

1、首先,把epsonl385打印机插上电源通电,待自检完成后,便可以设置。如果用户家里的无线路由器带有WPS(Wi-Fi Protected Setup)或QSS(又称快速安全设置)功能,那就简单多了。2、通过WPS或QSS无线路由器按钮连接,给无线路…

linux python定时任务调度,Python下定时任务框架APScheduler的使用

1.APScheduler简介:APScheduler是Python的一个定时任务框架,可以很方便的满足用户定时执行或者周期执行任务的需求,它提供了基于日期date、固定时间间隔interval 、以及类似于Linux上的定时任务crontab类型的定时任务。并且该框架不仅可以添加…

研究僵局–第1部分

我敢肯定我们都去过那里:太晚了,您饿了,服务器已挂起,或者应用程序正在以蜗牛的速度运行,并且有人喘着气想要您解决问题,然后再去解决。 您的应用程序意外挂起的可能原因之一是称为死锁的线程问题。 无需赘…

使用Vue.js和Axios从第三方API获取数据 — SitePoint

更多的往往不是,建立你的JavaScript应用程序时,你会想把数据从远程源或消耗一个[ API ](https:/ /恩。维基百科。org /维基/ application_programming_interface)。我最近看了一些[公开](https://github.co…

区位码怎么知道点阵里的起始点_自身免疫疾病的GAPS起始饮食改良版

写这篇文章的原因如果您已经关注我的博客一段时间,您知道我开始使用GAPS饮食,然后转换到AIP饮食,因为我仍在努力治疗炎症和自身免疫的发作。 Katy Haldiman 有同样的经历,我们并不孤单。许多患有自身免疫性疾病的人在 GAPS 上挣扎…

微信小程序APP(商超营销类)经验总结

项目介绍 这是一款主打门店营销的小程序。包括首页、门店、营销、个人设置、登录、数据统计展示、营销设置等。 本来要独立完成整个项目,包括前后端一套的,有些意外因素,项目临时收尾(说明:只完成了前端的部分&#…

excel不显示0_Excel数字过长不能完整显示?超长数字变为0

Excel中计算规则和限制设定数值精确度为15位!超过15位后,数字会显示为0excel数字超过15位,会显示为0,超过10位,默认采用科学计数法显示1、如何解决超长数字输入,全部显示问题?(单元格…

Android天气预报设计

——嵌入式软件开发 名字功能模块代码行数备注谢灿辉Widget200桌面小程序李杨敏GPS定位,百度地图API100-150获取当前所在城市丁小芳城市选择Activity,天气API获取天气100-200包括数据库交互本软件是一个天气类应用软件,带有widget&#xff0c…

算法笔记_164:算法提高 最小方差生成树(Java)

目录 1 问题描述 2 解决方案 1 问题描述 问题描述给定带权无向图,求出一颗方差最小的生成树。输入格式输入多组测试数据。第一行为N,M,依次是点数和边数。接下来M行,每行三个整数U,V,W,代表连接U,V的边,和权值W。保证图…

layui数据表格(一:基础篇,数据展示、分页组件、表格内嵌表单和图片)

表格展示神器之一:layui表格 前言:在写后台管理系统中使用最多的就是表格数据展示了,使用表格组件能提高大量的开发效率,目前主流的数据表格组件有bootstrap table、layui table、easyUI table等.... 博主个人比较倾向于layui&am…

算法设计与分析_算法设计与分析(第2版)第2章分治策略回顾

YI时间|外刊|MM-DFW|机器学习系列点击上方蓝字,关注给你写干货的松子茶分治策略是通用算法设计技术之一,很多有效的算法是它的特殊实现,顾名思义就是分而治之。一个问题能够用分治法求解的要素是问题能够按照某种方式分…

2017-2018-1 Java演绎法 第三周 作业

团队任务:团队展示与选题团队展示 队员学号及姓名 学号  姓名  主要负责工作  20162315  马军  日常统计,项目部分代码  20162316  刘诚昊  项目部分代码,代码质量测试  20162317  袁逸灏  组长 项目 主要 代码  201…

linux开机启动roscore,树莓派ubuntuMate系统中开机自启动ROS的launch文件

0x00 为何需要开机自启动launch文件在ROS开发后期阶段由于功能已经趋于稳定,因此就需要系统在一上电启动后就自动把ROS下的各节点程序加载运行,这样就省去了我们还得手动输入roslaunch命令来加载bringup的launch文件的操作。经过我的实际测试目前有两种方…

Oracle ADF移动世界! 你好!

您好,ADF Mobile,世界! 您可能已经知道... ADF Mobile在这里! 以下是一些链接,这些链接会让您有宾至如归的感觉。 ADF Mobile主页: http://www.oracle.com/technetwork/developer-tools/adf/overview/ad…

css 小知识点:inline/inline-block/line-height

inline: 此元素会被显示为内联元素,元素前后没有换行符。因此:无法设置宽度和高度~ inline-block: 行内块元素。元素前后没有换行符(CSS2.1 新增的值) 用通俗的话讲,就是不独占一行的块级元素。然后拥有…

协同过滤算法_机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用

本文始发于个人公众号:TechFlow,原创不易,求个关注今天是机器学习专题的第29篇文章,我们来聊聊SVD在上古时期的推荐场景当中的应用。推荐的背后逻辑有没有思考过一个问题,当我们在淘宝或者是某东这类电商网站购物的时候…