gpt4 book ai didi

java - ForkJoinPool 创建成千上万的线程

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:51:02 26 4
gpt4 key购买 nike

演示问题的简单测试:

package com.test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

public class Main extends RecursiveTask<Long> {
private volatile long start;
private volatile long end;
private volatile int deep;

public Main(long start, long end, int index, int deep) {
this.start = start;
this.end = end;
this.deep = deep;
// System.out.println(deep + "-" + index);
}

@Override
protected Long compute() {
long part = (end - start) / 10;
if (part > 1000 && deep < 10) {
List<RecursiveTask<Long>> subtasks = new ArrayList<RecursiveTask<Long>>();
for (int i = 0; i < 10; i++) {
long subtaskEnd = start + part;
if (i == 9) {
subtaskEnd = end;
}
subtasks.add(new Main(start, subtaskEnd, i, deep + 1));
start = subtaskEnd;
}

//CASE 1: generates 3000+ threads
for (int i = 0; i < 10; i++) {
subtasks.get(i).fork();
}

//CASE 2: generates 4 threads
// invokeAll(subtasks);

//CASE 3: generates 4 threads
// for (int i = 9; i >= 0; i--) {
// subtasks.get(i).fork();
// }


long count = 0;
for (int i = 0; i < 10; i++) {
count += subtasks.get(i).join();
}
return count;
} else {
long startStart = start;
while (start < end) {
start += 1;
}
return start - startStart;
}
}

private static ForkJoinPool executor = new ForkJoinPool();

public static void main(String[] args) throws Exception {
ForkJoinTask<Long> forkJoinTask = executor.submit(new Main(0, Integer.MAX_VALUE / 10, 0, 0));

Long result = forkJoinTask.get();
System.out.println("Final result: " + result);
System.out.println("Number of threads: " + executor.getPoolSize());
}

}

在这个示例中,我创建了 RecursiveTask,它只计算数字以在 CPU 上产生一些负载。将传入范围递归分成10份,当份数小于1000或递归“深度”大于10时开始计数。

在 compute() 方法中有 3 个案例被注释。区别仅在于 fork 子任务的顺序。根据我 fork 子任务的顺序,最后的线程数是不同的。在我的系统上,它为第一种情况创建了 3000 多个线程,为第二种和第三种情况创建了 4 个线程。

问题是:有什么区别?我真的需要了解这个框架的内部结构才能成功使用它吗?

最佳答案

这是我在 2011 年的一篇文章中解决的老问题,A Java Fork-Join Calamity文章指向显示修复的第二部分?为此,在 Java8 中(用停顿代替额外的线程。)

你真的不能用这个框架做很多专业的事情。您还可以使用其他框架。

关于java - ForkJoinPool 创建成千上万的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18722365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com