ForkJoin线程池的简单使用:从1累加到5

本文介绍了如何使用Java的ForkJoinPool实现从1累加到5的递归任务,并展示了任务拆分优化的MyForkJoinTask02类的应用,包括时间性能分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ForkJoin线程池的简单使用:从1累加到5

package com.codeify.springboot01.threadAndExecutor.chapter8;

import lombok.extern.slf4j.Slf4j;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

/**
 * @author codeify
 * @since 2022/06/15 18:24
 * <p>
 * forkjoin线程池的简单使用:从1累加到5
 */
@Slf4j
public class ForkJoinPoolTest {
    public static void main(String[] args) {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
//        MyForkJoinTask task = new MyForkJoinTask(5);
        MyForkJoinTask02 task = new MyForkJoinTask02(1, 5);
        LocalDateTime start = LocalDateTime.now();
        ForkJoinTask<Integer> submit = forkJoinPool.submit(task);
        try {
            Integer result = submit.get();
            log.info("result = {}", result);
            LocalDateTime end = LocalDateTime.now();
            long spend = Duration.between(start, end).toMillis();
            log.info("spend = {}", spend);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

class MyForkJoinTask extends RecursiveTask<Integer> {
    private Integer num;

    public MyForkJoinTask(Integer num) {
        this.num = num;
    }

    @Override
    protected Integer compute() {
        if (num.equals(1)) {
            return 1;
        }
        MyForkJoinTask task = new MyForkJoinTask(num - 1);
        task.fork();
        return num + task.join();
    }
}

// 任务拆分优化
class MyForkJoinTask02 extends RecursiveTask<Integer> {
    private Integer start;
    private Integer end;

    public MyForkJoinTask02(Integer start, Integer end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        if ((end - start) == 1) {
            return start + end;
        }
        if (start != null && start.equals(end)) {
            return start;
        }
        Integer middle = (start + end) / 2;
        MyForkJoinTask02 task1 = new MyForkJoinTask02(start, middle);
        MyForkJoinTask02 task2 = new MyForkJoinTask02(middle + 1, end);
        task1.fork();
        task2.fork();
        return task1.join() + task2.join();
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值