Parallel Java主要用于解决多核CPU环境下的并行计算问题,适用于CPU密集型任务(如大规模数据计算、批量处理、算法优化等)。新手需明确:并行并非“银弹”,若任务是I/O密集型(如网络请求、文件读写),并行可能因线程阻塞反而降低性能。
根据任务复杂度,推荐以下两种易上手的并行方案:
并行流是Java 8引入的特性,通过parallel()方法将顺序流转换为并行流,自动利用ForkJoinPool线程池执行任务。核心步骤:
stream());parallel()开启并行;collect()、reduce())汇总结果。示例代码(并行计算1~n的和):
public long parallelSum(long n) {
return Stream.iterate(1L, i -> i + 1) // 生成1到n的无限流
.limit(n) // 限制流的大小为n
.parallel() // 转换为并行流
.reduce(0L, Long::sum); // 并行归约求和
}
注意事项:
limit()、findFirst()等依赖顺序的操作混用(并行时顺序可能混乱);IntStream、LongStream等原始类型流(避免包装类Long的开销);ArrayList比LinkedList更适合并行)。Fork/Join框架通过“分而治之”策略处理可递归分解的任务,适合大规模计算任务(如归并排序、斐波那契数列)。核心类:
RecursiveTask<V>:有返回值的任务(如计算总和);ForkJoinPool:执行任务的线程池(默认使用ForkJoinPool.commonPool())。示例代码(并行计算1~n的和,使用RecursiveTask):
import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;
class SumTask extends RecursiveTask<Long> {
private final long start;
private final long end;
private static final long THRESHOLD = 1000; // 阈值:任务拆分的临界值
public SumTask(long start, long end) {
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
if (end - start <= THRESHOLD) { // 任务足够小,直接计算
long sum = 0;
for (long i = start; i <= end; i++) {
sum += i;
}
return sum;
} else { // 拆分任务
long mid = (start + end) / 2;
SumTask leftTask = new SumTask(start, mid);
SumTask rightTask = new SumTask(mid + 1, end);
leftTask.fork(); // 异步执行左子任务
long rightResult = rightTask.compute(); // 同步执行右子任务
long leftResult = leftTask.join(); // 等待左子任务完成
return leftResult + rightResult; // 合并结果
}
}
}
public class ForkJoinExample {
public static void main(String[] args) {
long n = 1000000;
ForkJoinPool pool = new ForkJoinPool();
SumTask task = new SumTask(1, n);
long result = pool.invoke(task); // 提交任务并获取结果
System.out.println("Sum: " + result);
}
}
注意事项:
THRESHOLD):过小会导致任务拆分过多(线程切换开销大),过大则失去并行优势;LinkedList拆分时需要遍历,效率远低于ArrayList;Stream.iterate()生成的无限流并行时可能预取大量数据,导致内存溢出;ConcurrentHashMap)或同步机制(如synchronized)。通过以上步骤,新手可快速掌握Parallel Java的基本用法。关键是从简单场景入手(如并行流处理集合),逐步过渡到复杂任务(如Fork/Join框架),同时注意避坑,才能高效利用并行计算提升程序性能。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。