Java中ForkJoin的临界值怎么选择比较好?

渊蓝 2021-07-22 22:16:33
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

public class ForkJoinTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        test1();
        System.out.println();
        test2();
    }

    /**
     * 直接单线程执行,作为对比
     */
    public static void test1(){
        Long sum = 0L;
        Long start = System.currentTimeMillis();
        for (Long i = 1L; i <=10000000000L; i++) {
            sum = sum + i;
        }
        Long end = System.currentTimeMillis();
        System.out.printf("结果为:%d,耗时:%d",sum,(end-start));
    }
    /**
     * 使用ForkJoin
     */
    public static void test2() throws ExecutionException, InterruptedException {
        Long start = System.currentTimeMillis();
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinDemo forkJoinDemo = new ForkJoinDemo(1L,10000000000L);
        ForkJoinTask<Long> forkJoinTask = forkJoinPool.submit(forkJoinDemo);
        Long sum = forkJoinTask.get();
        Long end = System.currentTimeMillis();
        System.out.printf("结果为:%d,耗时:%d",sum,(end-start));
    }

   
}


class ForkJoinDemo extends RecursiveTask<Long>{
    //临界值设置
    private static final long THRESHOLD = 25000000L;
    private Long start;
    private Long end;

    public ForkJoinDemo(Long start, Long end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        if (end-start<=THRESHOLD){
            Long sum = 0L;
            for (Long i = start; i <= end; i++) {
                sum+=i;
            }
            return sum;
        }else{
            //ForkJoin
            Long middle = (start + end)/2;
            //拆分线程
            ForkJoinDemo task1 = new ForkJoinDemo(start,middle);
            //把线程压入队列
            task1.fork();
            ForkJoinDemo task2 = new ForkJoinDemo(middle+1,end);
            task2.fork();
            return task1.join()+task2.join();
        }
    }
}

 

...全文
743 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-Java 发布问题, 以便更快地解决您的疑问

51,408

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧