- 浏览: 84740 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (61)
- mysql数据库 浮点型数据查询 插入 (2)
- linux系统相关 (3)
- nginx (3)
- mysql 数据库查询 (2)
- java (13)
- 框架搭建 (0)
- jsp 页面传值总结 (2)
- bug解决 (4)
- js (2)
- ajax (2)
- 远程接口调用 (1)
- 页面美化 (4)
- spring (2)
- jquery validate (2)
- struts2 url 规范 (1)
- Log4j配置 (1)
- 数据结构 (1)
- 数据结构--算法 (1)
- 规划 (1)
- JSON传输,刷新 (1)
- java 中文乱码 (2)
- highcharts (0)
- get两次请求 相同的执行语句并行执行两次 而不是依次各执行一次 (1)
- 数据库配置文件异常处理 (1)
- spring MVC学习笔记 (1)
- 软交换与SIP实用技术 (0)
- socket (0)
- 数据库 (0)
- google map 多标记和信息显示 (1)
- 富客户端 (0)
- mysql 存储程序 (0)
- java 性能处理 (12)
- 并发 (12)
- 通信性能 (0)
- mina (0)
- 多线程 (11)
- postgreSql (1)
- 集群 (1)
- java 7 tutorial 文档翻译 (13)
- Basic I/O (0)
- Java Paltform Learning Path (0)
- 基础巩固 Building On the Foundation (0)
- Fervor Over Server 热衷服务器 (0)
最新评论
-
plumordy:
我也遇到这种问题,get中文参数乱码,在本地和一个服务器上都好 ...
linux下 url中文参数乱码问题 -
纳兰萝卜:
怎么我的编码 然后linux System.out.print ...
linux下 url中文参数乱码问题 -
geyaandy:
我也遇到了同样的问题,用你的方式解决了,但是还是不明白为什么
linux下 url中文参数乱码问题
Fork/Join(分开/联合)
Fork/Join框架式ExecutorService接口的实现,帮助你充分利用多处理器。它被设计成能递归的分解成更小部分工作。目标是使用所有可用的处理能力来提升你的应用的处理能力。
与其他ExecutorService实现一样,fork/join框架在一个线程池中分发任务给工作线程。因为使用一个work-stealing算法是这个框架截然不同。那些已经处理完任务的工作线程可以从其他正忙的线程中抢断任务。
这个框架的核心是ForkJoinPool类,一个AbstractExecutorService 类的扩展。ForkJoinPool 实现了核心work-stealing算法的实现并可以执行ForkJoinPool流程。
基本用法
使用这个框架的第一步是编写执行一段工作的代码。你的代码应该跟一下的伪代码相似:
if (my portion of the work is small enough)
do the work directly
else
split my work into two pieces
invoke the two pieces and wait for the results
在ForkJoinTask子类中封装这些代码,通常使用更专业的类型的一个,不管是RecursiveTask(可返回一个结果)还是RecursiveAction。
在你的ForkJoinTask子类准备好后,创建一个对象负责处理所有的工作并将它穿给ForkJoinPool实例的invoke方法。
Blurring for Clarity(清晰的模糊化处理 暂时这样翻译)
为帮助理解这个框架式如何工作的,考虑一下例子。假如你想模糊一个图片。原始来源图片由一个整形数组表示,数组中的每个整形表示单一像素的颜色值。模糊后的目标图片也用一个整形数组表示,数组大小与源相同。
执行模糊化通过处理一次源数组的像素而数量完成。每个像素是周围像素的平均值(红色,绿色和蓝色成分求平均),结果就存入目标数组中。因为一个图片是一个很大的数组,这个处理会话费很长时间。你可以充分利用多处理器上的并发处理通过实现fork/join框架的抢断算法。下面是一个可能实现:
public class ForkBlur extends RecursiveAction {
private int[] mSource;
private int mStart;
private int mLength;
private int[] mDestination;
// Processing window size; should be odd.
private int mBlurWidth = 15;
public ForkBlur(int[] src, int start, int length, int[] dst) {
mSource = src;
mStart = start;
mLength = length;
mDestination = dst;
}
protected void computeDirectly() {
int sidePixels = (mBlurWidth - 1) / 2;
for (int index = mStart; index < mStart + mLength; index++) {
// Calculate average.
float rt = 0, gt = 0, bt = 0;
for (int mi = -sidePixels; mi <= sidePixels; mi++) {
int mindex = Math.min(Math.max(mi + index, 0),
mSource.length - 1);
int pixel = mSource[mindex];
rt += (float)((pixel & 0x00ff0000) >> 16)
/ mBlurWidth;
gt += (float)((pixel & 0x0000ff00) >>
/ mBlurWidth;
bt += (float)((pixel & 0x000000ff) >> 0)
/ mBlurWidth;
}
// Reassemble destination pixel.
int dpixel = (0xff000000 ) |
(((int)rt) << 16) |
(((int)gt) << |
(((int)bt) << 0);
mDestination[index] = dpixel;
}
}
...
现在你实现抽象方法compute(),这个方法将直接模糊处理或者将模糊分解成两个更小的任务。简单的数组长度threshold 帮助决定工作是执行还是分割。
protected static int sThreshold = 100000;
protected void compute() {
if (mLength < sThreshold) {
computeDirectly();
return;
}
int split = mLength / 2;
invokeAll(new ForkBlur(mSource, mStart, split, mDestination),
new ForkBlur(mSource, mStart + split, mLength - split,
mDestination));
}
如果先前的方法在RecursiveAction 类的子类中,那么设置任务在ForkJoinPool中运行是理所当然的,按照以下步骤调用:
1 创建一个任务表示要处理的所有工作
// source image pixels are in src
// destination image pixels are in dst
ForkBlur fb = new ForkBlur(src, 0, src.length, dst);
2 创建一个ForkJoinPool 来运行任务
ForkJoinPool pool = new ForkJoinPool();
3 运行任务
pool.invoke(fb);
对于全部源代码,包括额外的创建目标图片文件的源代码看ForkBlur例子。
标准实现
除了使用这种框架在一个多处理器系统上实现自定义算法来并发处理任务,在java SE中有许多一般有用的功能使用fork/join框架也实现了。一个这样的实现在java se8中介绍,被java.util.Arrays 类用于它的parallelSort()方法。这些方法与sort()相似,但是借助fork/join框架实现了并发处理。然而,这个框架通过这三个方法如何确切的起到杠杆作用的就超出本书范围,对于这个信息就查询JAVA API文档。
这个框架的另一个实现用于java.util.streams包中,是java se 8 版本调用的Project Lambda的部分。为了更多信息,请参考Lambda Expressions 小节
与其他ExecutorService实现一样,fork/join框架在一个线程池中分发任务给工作线程。因为使用一个work-stealing算法是这个框架截然不同。那些已经处理完任务的工作线程可以从其他正忙的线程中抢断任务。
这个框架的核心是ForkJoinPool类,一个AbstractExecutorService 类的扩展。ForkJoinPool 实现了核心work-stealing算法的实现并可以执行ForkJoinPool流程。
基本用法
使用这个框架的第一步是编写执行一段工作的代码。你的代码应该跟一下的伪代码相似:
if (my portion of the work is small enough)
do the work directly
else
split my work into two pieces
invoke the two pieces and wait for the results
在ForkJoinTask子类中封装这些代码,通常使用更专业的类型的一个,不管是RecursiveTask(可返回一个结果)还是RecursiveAction。
在你的ForkJoinTask子类准备好后,创建一个对象负责处理所有的工作并将它穿给ForkJoinPool实例的invoke方法。
Blurring for Clarity(清晰的模糊化处理 暂时这样翻译)
为帮助理解这个框架式如何工作的,考虑一下例子。假如你想模糊一个图片。原始来源图片由一个整形数组表示,数组中的每个整形表示单一像素的颜色值。模糊后的目标图片也用一个整形数组表示,数组大小与源相同。
执行模糊化通过处理一次源数组的像素而数量完成。每个像素是周围像素的平均值(红色,绿色和蓝色成分求平均),结果就存入目标数组中。因为一个图片是一个很大的数组,这个处理会话费很长时间。你可以充分利用多处理器上的并发处理通过实现fork/join框架的抢断算法。下面是一个可能实现:
public class ForkBlur extends RecursiveAction {
private int[] mSource;
private int mStart;
private int mLength;
private int[] mDestination;
// Processing window size; should be odd.
private int mBlurWidth = 15;
public ForkBlur(int[] src, int start, int length, int[] dst) {
mSource = src;
mStart = start;
mLength = length;
mDestination = dst;
}
protected void computeDirectly() {
int sidePixels = (mBlurWidth - 1) / 2;
for (int index = mStart; index < mStart + mLength; index++) {
// Calculate average.
float rt = 0, gt = 0, bt = 0;
for (int mi = -sidePixels; mi <= sidePixels; mi++) {
int mindex = Math.min(Math.max(mi + index, 0),
mSource.length - 1);
int pixel = mSource[mindex];
rt += (float)((pixel & 0x00ff0000) >> 16)
/ mBlurWidth;
gt += (float)((pixel & 0x0000ff00) >>
/ mBlurWidth;
bt += (float)((pixel & 0x000000ff) >> 0)
/ mBlurWidth;
}
// Reassemble destination pixel.
int dpixel = (0xff000000 ) |
(((int)rt) << 16) |
(((int)gt) << |
(((int)bt) << 0);
mDestination[index] = dpixel;
}
}
...
现在你实现抽象方法compute(),这个方法将直接模糊处理或者将模糊分解成两个更小的任务。简单的数组长度threshold 帮助决定工作是执行还是分割。
protected static int sThreshold = 100000;
protected void compute() {
if (mLength < sThreshold) {
computeDirectly();
return;
}
int split = mLength / 2;
invokeAll(new ForkBlur(mSource, mStart, split, mDestination),
new ForkBlur(mSource, mStart + split, mLength - split,
mDestination));
}
如果先前的方法在RecursiveAction 类的子类中,那么设置任务在ForkJoinPool中运行是理所当然的,按照以下步骤调用:
1 创建一个任务表示要处理的所有工作
// source image pixels are in src
// destination image pixels are in dst
ForkBlur fb = new ForkBlur(src, 0, src.length, dst);
2 创建一个ForkJoinPool 来运行任务
ForkJoinPool pool = new ForkJoinPool();
3 运行任务
pool.invoke(fb);
对于全部源代码,包括额外的创建目标图片文件的源代码看ForkBlur例子。
标准实现
除了使用这种框架在一个多处理器系统上实现自定义算法来并发处理任务,在java SE中有许多一般有用的功能使用fork/join框架也实现了。一个这样的实现在java se8中介绍,被java.util.Arrays 类用于它的parallelSort()方法。这些方法与sort()相似,但是借助fork/join框架实现了并发处理。然而,这个框架通过这三个方法如何确切的起到杠杆作用的就超出本书范围,对于这个信息就查询JAVA API文档。
这个框架的另一个实现用于java.util.streams包中,是java se 8 版本调用的Project Lambda的部分。为了更多信息,请参考Lambda Expressions 小节
发表评论
-
疑问和练习:并发
2014-06-08 13:48 0问题: 1 你能传一个线程对象给Executor.exec ... -
Concurrent Random Numbers 并发随机数
2014-06-08 01:37 0在jdk7中,Java.util.concurrent包括 ... -
Atomic Variables 原子变量
2014-06-08 01:26 916java.util.concurrent.atmoic包定义了 ... -
Concurrent Collections 并发集合
2014-06-08 00:58 639java.util.concurrent包 包含了大量J ... -
Thread Pools 线程池
2014-06-08 00:59 670大多数Executor的实现使用线程池,是由工作线程组成。 ... -
Executor Interfaces 执行器接口
2014-06-08 00:59 715java.util.Concurrent包定义了三类执行 ... -
Executors 执行器
2014-06-07 02:56 556在之前的所有例子中,在一个任务被一个新的线程(被定义为Ru ... -
Lock Objects 锁对象
2014-06-07 02:45 817同步代码依赖一种简单的可重入锁。虽然这种锁很容易使用,但 ... -
High Level Concurrency Objects 高级并发对象
2014-06-07 02:21 603至今,课关注低级API,从最开始已经成为java平台的部分 ... -
Immutable Objects 不可变对象
2014-06-07 01:56 546如果一个对象在创建后它的状态不可变那这个对象被认为是不可变 ... -
Guarded Blocks 保护块
2014-06-07 00:53 612线程经常需要协调它们的活动,最常用的协调方法是保护块。这样 ... -
活性(Liveness)
2014-06-06 23:58 553并发应用程序及时执行的能力被叫做它的活性。这块描述了最普 ... -
原子访问(Atomic Access)
2014-06-06 22:24 1000在编程中,原子动作是一个突然有效地发生。一个原子动作在中 ... -
内在锁和同步
2014-06-06 21:52 532同步是建立在一个内部的实体上,被称作内在锁或者监视锁。(同步锁 ... -
如何判断方法是否需要同步
2014-03-27 11:01 0如何判断一个方法是否需要同步? 如果一个方法接受传参 根据传值 ... -
多线程中 静态方法与非静态方法class对象与instance区别
2014-03-27 10:35 588class对象 instance对象 两者在 ... -
java nio 开发笔记
2014-03-23 11:23 310java nio 原理 NIO有一个主要的类Selecto ...
相关推荐
在Java编程领域,Fork/Join框架是一种并行计算模型,设计用于高效处理大量数据,尤其是在多核处理器系统上。这个框架是Java 7引入的一个重要特性,它基于分而治之(Divide and Conquer)策略,将复杂任务拆分为更小...
Fork/Join框架是Java并发处理的一个重要工具,它基于工作窃取算法,设计用于高效地执行并行计算任务。这个框架是Java 7引入的,位于`java.util.concurrent.fork/join`包中,目的是简化多核处理器环境下大规模数据...
Fork/Join框架是Java7引入的一种用于并行任务执行的框架,它允许将复杂任务拆分成多个子任务,并行执行,然后通过join操作将结果聚合。Fork/Join框架特别适合处理可以递归拆分的计算密集型任务,比如大数据集的搜索...
结合这两个技术,你可以创建高效的并发服务器,比如一个服务器端使用NIO监听和处理来自多个客户端的连接,而每个客户端请求的处理则可以利用Fork/Join框架进行并行计算。在实际项目中,`nioSample`工程可能包含这些...
Fork/Join框架Package jsr166y是Java 7并行编程类的的初步版本(Preliminary versions of classes targeted for Java 7.)
看了下Java Tutorials中的fork/join章节,整理下。 什么是fork/join框架 fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核处理器的优势,编写出并行执行的程序,提高应用程序的...
Fork/Join框架是Java并发库中的一部分,自Java 7开始引入,它为开发者提供了一种高效的处理大规模计算任务的方法。这个框架基于分治策略,将大任务分解成若干小任务,然后并行执行这些小任务,最后再将结果合并。...
Java的Fork/Join框架是一种用于并行计算的框架,它基于分治法的原理,将大任务分解成小任务并行执行,最后再将结果合并。这种框架特别适合于可以分解为多个子任务且子任务可以并行处理的场景。本文将详细介绍Fork/...
Fork/Join框架是Java SE 7引入的一项重要技术,它使得编写高效、并行的程序变得更加容易。本文将简要回顾Java中的并发编程基础知识,介绍java.util.concurrent包提供的高级并发原语,并深入探讨Fork/Join框架及其在...
Java的Fork/Join框架是Java 7引入的一个并行计算工具,它是基于分而治之(Divide and Conquer)策略的。该框架旨在简化并行编程,尤其是在多核处理器环境中提高性能。Fork/Join框架的核心类包括`ForkJoinPool`和`...
Java Fork/Join 并行框架 Java Fork/Join 并行框架是 Java 7 中引入的一个并行任务框架,可以将任务分割成足够小的小任务,然后让不同的线程来做这些分割出来的小事情,然后完成之后再进行 join,将小任务的结果...
Java Fork/Join框架是Java 7引入的一种并行计算模型,设计目的是为了高效地处理大量数据,尤其是在多核处理器环境中。该框架的核心理念是通过将复杂的大任务分解为多个小任务,然后并行执行这些小任务,从而加速计算...
Fork/Join框架基于分治策略,即将一个复杂的大任务分解成两个或更多个较小的任务,直到这些任务小到可以直接计算结果,然后将这些结果合并得到最终答案。在Java中,Fork/Join框架主要由`ForkJoinPool`线程池和`...
全网第一篇通过图文介绍Fork/Join框架与CompleteableFuture的PPT
fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核处理器的优势,编写出并行执行的程序,提高应用程序的性能;设计的目的是为了处理那些可以被递归拆分的任务。
Fork/Join框架的测试demo,含源代码。 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过Fork和Join这两个...
在Java并发编程中,Fork/Join框架是一个强大的工具,尤其在处理大量数据时能显著提升性能。这个框架从Java 7开始引入,是ExecutorService的一个实现,它基于分而治之的策略,将大任务分解成多个小任务,然后并行地...
Java 8 中的 Fork/Join 框架和 Optional 框架使用 Java 8 中的 Fork/Join 框架和 Optional 框架是两个非常重要的框架,它们在多线程编程和数据处理中发挥着重要作用。下面我们将详细介绍这两个框架的使用和原理。 ...