`
zuimeitulip
  • 浏览: 59771 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

ForkJoinPool线程池

 
阅读更多

最近再学多线程。突然看到ForkJoinPool这个线程池。以前并不了解

Java 7提供了ForkJoinPool来支持将一个任务拆分成多个“小任务”并行计算,再把多个“小任务”的结果合并成总的计算结果。ForkJoinPool是ExecutorServcie的实现类,因此是一种特殊的线程池。

创建了ForkJoinPool实例之后,可以调用ForkJoinPool的submit(ForkJoinTask task)或者invoke(ForkJoinTask task)方法来执行指定任务了。其中ForkJoinTask代表一个可以并行,合并的任务。有两个抽象的子类RecursiveAction和RecursiveTask。其中RecursiveTask代表有返回值的任务,而RecursiveAction代表没有繁殖的任务。

下面举个例子:

下面以直线没有返回值的“大任务”(打印0-300的数值)为例,程序讲一个“大任务”拆分成多个“小任务”,病将任务交给ForkJoinPool来执行。

class PrintTask extends RecursiveAction

{

     //每个小任务最多打印50个数

     private static final int THRESHOLD = 50;

     private int start;

     private int end;

     public PrintTask(int start, int end){

         this.start = start;

         this.end = end;

     }

     @Override

     protected void compute(){

         if(end - start < THRESHOLD){

               for(int i = start ; i< end ; i++){

                     System.out.println(Thread.currentThread.getName()+"的i的值"+i);

               }  

         }else{

               int middle = (start+end)/2;

               PrintTask left = new PrintTask(start,middle);

               PrintTask right = new PrintTask(middle,end);

               left.fork();

               right.fork();

         }

     }

}

 

public class ForkJoinPoolTest{

    public static void main(String[] args){

         ForkJoinPool pool = new ForkJoinPool();

         pool.submit(new PrintTask(0,300));

         pool.awaitTermination(2,TimeUnit.SECONDS);

         pool.shutdown();

    }

}

分享到:
评论

相关推荐

    13、线程池ForkJoinPool工作原理分析

    线程池ForkJoinPool是Java并发编程中的一个重要工具,它是Java 7引入的一个新特性,主要用于优化并行计算,特别是在处理大量可分任务时,如递归算法。ForkJoinPool是基于工作窃取(Work-Stealing)算法的线程池,...

    Java线程池ForkJoinPool实例解析

    Java线程池ForkJoinPool实例解析 Java线程池ForkJoinPool实例解析是Java并发编程中的一种高级主题,ForkJoinPool是Java 7中引入的一种新的线程池实现,它可以充分利用多CPU和多核CPU的优势,使得并发编程变得更加...

    Java新的线程持池ForkJoinPool.pdf

    Java中的ForkJoinPool是Java 7引入的一种新的线程池实现,它是为了解决大量并行计算场景下的效率问题而设计的。ForkJoinPool的设计理念基于分治策略(Divide and Conquer),适用于那些可以拆分成多个子任务的任务,...

    13、线程池ForkJoinPool实战及其工作原理分析(1).pdf

    - **定义**: `ForkJoinPool`是Java 7引入的一种用于执行大量细粒度并行任务的线程池。 - **特点**: 它主要通过`Fork-Join`框架实现,能够有效地管理并行任务,特别是适用于那些可以被细分为更小任务的任务类型。 ##...

    Java多线程ForkJoinPool实例详解

    ForkJoinPool的优点是可以高效地执行任务,并且可以自动地管理线程池,避免了手动创建和管理线程的麻烦。ForkJoinPool也提供了任务状态信息和执行信息,可以方便地监控和管理任务的执行过程。 ForkJoinPool是Java多...

    ForkJoinPool

    ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行;当多个“小任务”执行完成之后,再将这些执行结果合并起来即可。 ...

    开启Java8并行流,算法时间大幅提升.docx

    并行流的实现依赖于ForkJoinPool线程池,其默认线程数等于处理器的核心数。可以通过设置系统属性`java.util.concurrent.ForkJoinPool.common.parallelism`来改变线程池大小,但这将影响所有并行流。目前,Java尚不...

    Java进阶学习——Java多线程知识的理解

    Java多线程知识的理解0.前言1....创建ForkJoinPool线程池5.2.4.1.使用invokeall()5.2.4.2.使用fork()5.2.4.3.使用invoke()5.2.5.4运行测试6.本文出现的多线程常见问题解答6.1.为什么主线程早于子线

    Java8并行流中自定义线程池操作示例

    知识点:可以使用ForkJoinPool的构造方法并设定并行级别来创建一个自定义的线程池。 4. 总结 我们简要地看了一下,如何使用一个自定义的Thread Pool运行并行流。只要在正确的环境中配置了合适的平行级别,就能在...

    parallel-stream-fork-join-pool

    所有并行流执行都使用相同的(单例)线程池:ForkJoinPool.commonPool()。 这就是为什么在并行流中执行 IO(更常见的是阻塞调用)非常糟糕的原因:被阻塞的线程无法被 JVM 中的所有并行流使用。 为此,您必须改用 ...

    35 拆分你的任务—学习使用Fork-Join框架.pdf

    客户端代码中,首先创建一个ForkJoinPool实例,通常我们会使用ForkJoinPool.commonPool()来获取一个默认的线程池。然后,提交一个Task实例,ForkJoinPool会自动处理任务的拆分和结果的合并。最后,通过调用Task的get...

    java7 并发编程forjoinpool

    **ForkJoinPool** 是一个特殊的线程池,它设计的目标是支持分治算法的高效执行。与传统的 ExecutorService 不同,ForkJoinPool 使用工作窃取算法,确保线程不会因为等待新任务而阻塞,而是能够从其他已完成的任务中...

    fork/join 实例

    1. **ForkJoinPool**: ForkJoinPool是线程池,它执行ForkJoinTask。每个工作线程都有一个双端队列,用于存储子任务。当工作线程没有任务时,它会从其他工作线程的任务队列中“窃取”任务,这就是工作窃取算法的体现...

    常用多线程模板与鱼刺类多线程线程池应用小例子

    ForkJoinPool pool = new ForkJoinPool(); int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9}; SumCalculator task = new SumCalculator(numbers, 0, numbers.length); pool.invoke(task); System.out.println(...

    Java中的Fork,Join框架深度解析

    尽量使用ForkJoinPool.commonPool()来获取默认的线程池,以减少资源消耗。 合理设置任务的分解阈值,以避免过度分解导致的性能下降。 避免在RecursiveTask内部使用ForkJoinPool的invoke方法,而应该直接调用compute...

    JAVA集中常用的线程池比较共8页.pdf.zip

    主要基于Java的`java.util.concurrent`包下的`ExecutorService`接口及其实现,包括`ThreadPoolExecutor`、`Executors`提供的几种静态工厂方法创建的线程池,以及`ForkJoinPool`。 首先,我们来了解`ExecutorService...

    Fork Join框架机制详解.docx

    在Java中,Fork/Join框架主要由`ForkJoinPool`线程池和`ForkJoinTask`任务类组成。 1. `ForkJoinPool`:这是Fork/Join框架的工作线程池。它维护着一组工作线程,用于执行`ForkJoinTask`。线程池中的每个工作线程都...

    Java中的线程与线程池.pptx

    5. ForkJoinPool:用于执行Fork/Join框架的任务,适用于分割任务并行执行的场景。 ThreadPoolExecutor是线程池的核心实现,其构造函数的参数定义了线程池的行为: - corePoolSize:核心线程数,即使无任务,这些...

    Go-Golang版的fork-join

    `ForkJoinPool`是一个线程池,负责管理并执行`ForkJoinTask`。`ForkJoinTask`是可分叉的任务,它可以进一步分成更小的任务,并使用`fork()`方法分发,使用`join()`方法等待子任务完成。 在Golang的实现中,我们可能...

    线程池的使用介绍Demo,简单明了。

    3. 使用WorkStealingPool处理大量短生命周期的任务,它使用ForkJoinPool,能够更高效地利用多核处理器。 七、总结 通过本Demo,我们了解了如何在Android中使用线程池来管理和调度线程。合理的线程池使用不仅可以...

Global site tag (gtag.js) - Google Analytics