- Java 并发教程
- 并发 - 首页
- 并发 - 概述
- 并发 - 环境设置
- 并发 - 主要操作
- 线程间通信
- 并发 - 同步
- 并发 - 死锁
- 工具类示例
- 并发 - ThreadLocal
- 并发 - ThreadLocalRandom
- 锁示例
- 并发 - Lock
- 并发 - ReadWriteLock
- 并发 - Condition
- 原子变量示例
- 并发 - AtomicInteger
- 并发 - AtomicLong
- 并发 - AtomicBoolean
- 并发 - AtomicReference
- 并发 - AtomicIntegerArray
- 并发 - AtomicLongArray
- 并发 - AtomicReferenceArray
- Executor 示例
- 并发 - Executor
- 并发 - ExecutorService
- ScheduledExecutorService
- 线程池示例
- 并发 - newFixedThreadPool
- 并发 - newCachedThreadPool
- newScheduledThreadPool
- newSingleThreadExecutor
- 并发 - ThreadPoolExecutor
- ScheduledThreadPoolExecutor
- 高级示例
- 并发 - Futures 和 Callables
- 并发 - Fork-Join 框架
- 并发集合
- 并发 - BlockingQueue
- 并发 - ConcurrentMap
- ConcurrentNavigableMap
- 并发有用资源
- 并发 - 快速指南
- 并发 - 有用资源
- 并发 - 讨论
Java 并发 - Fork-Join 框架
Fork-Join 框架允许将某个任务分解成多个工作线程,然后等待结果并将它们组合起来。它在很大程度上利用了多处理器机器的能力。以下是 Fork-Join 框架中使用的核心概念和对象。
Fork(分叉)
Fork 是一个过程,其中一个任务将自身拆分为更小且独立的子任务,这些子任务可以并发执行。
语法
Sum left = new Sum(array, low, mid); left.fork();
这里 Sum 是 RecursiveTask 的一个子类,left.fork() 将任务拆分为子任务。
Join(合并)
Join 是一个过程,其中一个任务在子任务完成执行后合并所有子任务的结果,否则它将一直等待。
语法
left.join();
这里 left 是 Sum 类的对象。
ForkJoinPool
它是一个专门为处理 Fork-Join 任务拆分而设计的线程池。
语法
ForkJoinPool forkJoinPool = new ForkJoinPool(4);
这里创建一个新的 ForkJoinPool,其并行级别为 4 个 CPU。
RecursiveAction
RecursiveAction 表示一个不返回值的任务。
语法
class Writer extends RecursiveAction { @Override protected void compute() { } }
RecursiveTask
RecursiveTask 表示一个返回值的任务。
语法
class Sum extends RecursiveTask<Long> { @Override protected Long compute() { return null; } }
示例
以下 TestThread 程序展示了在基于线程的环境中使用 Fork-Join 框架。
import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; public class TestThread { public static void main(final String[] arguments) throws InterruptedException, ExecutionException { int nThreads = Runtime.getRuntime().availableProcessors(); System.out.println(nThreads); int[] numbers = new int[1000]; for(int i = 0; i < numbers.length; i++) { numbers[i] = i; } ForkJoinPool forkJoinPool = new ForkJoinPool(nThreads); Long result = forkJoinPool.invoke(new Sum(numbers,0,numbers.length)); System.out.println(result); } static class Sum extends RecursiveTask<Long> { int low; int high; int[] array; Sum(int[] array, int low, int high) { this.array = array; this.low = low; this.high = high; } protected Long compute() { if(high - low <= 10) { long sum = 0; for(int i = low; i < high; ++i) sum += array[i]; return sum; } else { int mid = low + (high - low) / 2; Sum left = new Sum(array, low, mid); Sum right = new Sum(array, mid, high); left.fork(); long rightResult = right.compute(); long leftResult = left.join(); return leftResult + rightResult; } } } }
这将产生以下结果。
输出
32 499500
广告