最近再学多线程。突然看到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();
}
}
相关推荐
线程池ForkJoinPool是Java并发编程中的一个重要工具,它是Java 7引入的一个新特性,主要用于优化并行计算,特别是在处理大量可分任务时,如递归算法。ForkJoinPool是基于工作窃取(Work-Stealing)算法的线程池,...
Java线程池ForkJoinPool实例解析 Java线程池ForkJoinPool实例解析是Java并发编程中的一种高级主题,ForkJoinPool是Java 7中引入的一种新的线程池实现,它可以充分利用多CPU和多核CPU的优势,使得并发编程变得更加...
Java中的ForkJoinPool是Java 7引入的一种新的线程池实现,它是为了解决大量并行计算场景下的效率问题而设计的。ForkJoinPool的设计理念基于分治策略(Divide and Conquer),适用于那些可以拆分成多个子任务的任务,...
- **定义**: `ForkJoinPool`是Java 7引入的一种用于执行大量细粒度并行任务的线程池。 - **特点**: 它主要通过`Fork-Join`框架实现,能够有效地管理并行任务,特别是适用于那些可以被细分为更小任务的任务类型。 ##...
ForkJoinPool的优点是可以高效地执行任务,并且可以自动地管理线程池,避免了手动创建和管理线程的麻烦。ForkJoinPool也提供了任务状态信息和执行信息,可以方便地监控和管理任务的执行过程。 ForkJoinPool是Java多...
ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行;当多个“小任务”执行完成之后,再将这些执行结果合并起来即可。 ...
并行流的实现依赖于ForkJoinPool线程池,其默认线程数等于处理器的核心数。可以通过设置系统属性`java.util.concurrent.ForkJoinPool.common.parallelism`来改变线程池大小,但这将影响所有并行流。目前,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.为什么主线程早于子线
知识点:可以使用ForkJoinPool的构造方法并设定并行级别来创建一个自定义的线程池。 4. 总结 我们简要地看了一下,如何使用一个自定义的Thread Pool运行并行流。只要在正确的环境中配置了合适的平行级别,就能在...
所有并行流执行都使用相同的(单例)线程池:ForkJoinPool.commonPool()。 这就是为什么在并行流中执行 IO(更常见的是阻塞调用)非常糟糕的原因:被阻塞的线程无法被 JVM 中的所有并行流使用。 为此,您必须改用 ...
客户端代码中,首先创建一个ForkJoinPool实例,通常我们会使用ForkJoinPool.commonPool()来获取一个默认的线程池。然后,提交一个Task实例,ForkJoinPool会自动处理任务的拆分和结果的合并。最后,通过调用Task的get...
**ForkJoinPool** 是一个特殊的线程池,它设计的目标是支持分治算法的高效执行。与传统的 ExecutorService 不同,ForkJoinPool 使用工作窃取算法,确保线程不会因为等待新任务而阻塞,而是能够从其他已完成的任务中...
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(...
尽量使用ForkJoinPool.commonPool()来获取默认的线程池,以减少资源消耗。 合理设置任务的分解阈值,以避免过度分解导致的性能下降。 避免在RecursiveTask内部使用ForkJoinPool的invoke方法,而应该直接调用compute...
主要基于Java的`java.util.concurrent`包下的`ExecutorService`接口及其实现,包括`ThreadPoolExecutor`、`Executors`提供的几种静态工厂方法创建的线程池,以及`ForkJoinPool`。 首先,我们来了解`ExecutorService...
在Java中,Fork/Join框架主要由`ForkJoinPool`线程池和`ForkJoinTask`任务类组成。 1. `ForkJoinPool`:这是Fork/Join框架的工作线程池。它维护着一组工作线程,用于执行`ForkJoinTask`。线程池中的每个工作线程都...
5. ForkJoinPool:用于执行Fork/Join框架的任务,适用于分割任务并行执行的场景。 ThreadPoolExecutor是线程池的核心实现,其构造函数的参数定义了线程池的行为: - corePoolSize:核心线程数,即使无任务,这些...
`ForkJoinPool`是一个线程池,负责管理并执行`ForkJoinTask`。`ForkJoinTask`是可分叉的任务,它可以进一步分成更小的任务,并使用`fork()`方法分发,使用`join()`方法等待子任务完成。 在Golang的实现中,我们可能...
3. 使用WorkStealingPool处理大量短生命周期的任务,它使用ForkJoinPool,能够更高效地利用多核处理器。 七、总结 通过本Demo,我们了解了如何在Android中使用线程池来管理和调度线程。合理的线程池使用不仅可以...