`
luccs624061082
  • 浏览: 82573 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多
  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 小节
   
分享到:
评论

相关推荐

    Fork/Join例子

    Fork/Join例子

    Fork/Join框架Package jsr166y

    Fork/Join框架Package jsr166y是Java 7并行编程类的的初步版本(Preliminary versions of classes targeted for Java 7.)

    fork/join 实例

    fork join 框架 生产使用实例,可以直接修改配置,实现业务。

    java NIO用法及java fork/join 用法源码工程

    1.ServerSocketChannel与SocketChannel通讯 2.java Fork/Join 与ThreadPool使用

    Java中的Fork/Join框架

    看了下Java Tutorials中的fork/join章节,整理下。  什么是fork/join框架  fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核处理器的优势,编写出并行执行的程序,提高应用程序的...

    JDK7中的ForkJoin模式

    而 JDK 7 中将会加入的 Fork/Join 模式是处理并行编程的一个经典的方法。虽然不能解决所有的问题,但是在它的适用范围之内,能够轻松的利用多个 CPU 提供的计算资源来协作完成一个复杂的计算任务。通过利用 Fork/...

    Java Fork/Join框架

    Fork/Join框架是Java7中新增的一项特性,也是Java7平台的其中一项主要改进。下面我们就来简单探讨下Java的Fork/Join框架

    java Fork Join框架及使用

    java Fork Join框架及使用,java自带的多线程框架,来处理多线程的问题

    浅谈Java Fork/Join并行框架

    主要介绍了浅谈Java Fork/Join并行框架,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Fork:join框架与CompleteableFuture源码解析.pptx

    全网第一篇通过图文介绍Fork/Join框架与CompleteableFuture的PPT

    java fork-join框架介绍

    fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核处理器的优势,编写出并行执行的程序,提高应用程序的性能;设计的目的是为了处理那些可以被递归拆分的任务。

    ForkJoinUtil.java,一个分而治之的框架工具类

    Fork/Join框架的测试demo,含源代码。 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过Fork和Join这两个...

    Java通过Fork/Join优化并行计算

    主要为大家详细介绍了Java通过Fork、Join来优化并行计算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    译文:Fork and Join: Java Can Excel at Painless Parallel Programming Too!

    译文:Fork and Join: Java Can Excel at Painless Parallel Programming Too!(Fork and Join Java也可以轻松地编写并发程序)

    Fork-Join框架演示

    Java Fork-Join 论文 排序

    Java并发Fork and join

    Java并发网文归并总结。Fork and join,比较详细

    Fork Join框架机制详解.docx

    Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务的执行结果得到这个大任务的最终结果。 这种机制策略在分布式数据库中非常常见,数据分布在不同的数据库的...

    java-fork-join-example

    与ExecutorService其他实现不同,Fork / Join框架使用工作窃取算法( ),该算法可最大程度地利用线程,并提供了一种更简单的方式来处理产生其他任务的任务(称为子任务)。 以下列出的所有代码都可以在以下位置...

    eclipse-collections-forkjoin-7.1.2-API文档-中文版.zip

    赠送jar包:eclipse-collections-forkjoin-7.1.2.jar; 赠送原API文档:eclipse-collections-forkjoin-7.1.2-javadoc.jar; 赠送源代码:eclipse-collections-forkjoin-7.1.2-sources.jar; 赠送Maven依赖信息文件:...

Global site tag (gtag.js) - Google Analytics