使用ForkJoin计算20000以内的奇数

使用ForkJoin计算20000以内的奇数

定义一个Task 继承 RecursiveTask<>

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

public class Task extends RecursiveTask<List<Integer>> {
    static final int THRESHOLD = 500;  //最小的子问题范围
    private int start;
    private int end;

    public Task(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected List<Integer> compute() {
        if (end - start <= THRESHOLD) {
            // 如果任务足够小,直接计算:
            List<Integer> list = new ArrayList<>(end - start + 1);
            for (int i = start; i < end; i++) {
                if (i % 2 == 1) {
                    list.add(i);
                }
            }
            return list;
        }
        // 任务太大,一分为二:
        int middle = (end + start) / 2;
        Task subtask1 = new Task(start, middle);
        Task subtask2 = new Task(middle, end);
        invokeAll(subtask1, subtask2);
        List<Integer> subresult1 = subtask1.join();
        List<Integer> subresult2 = subtask2.join();
        subresult1.addAll(subresult2);
        return subresult1;
    }
}
	/**
     * ForkJoin 方式
     */
    public void test01() {
        ForkJoinTask<List<Integer>> task = new Task(1, 20000);
        long startTime = System.currentTimeMillis();
        List<Integer> result = ForkJoinPool.commonPool().invoke(task);
        long endTime = System.currentTimeMillis();
        System.out.println("forkjoin :" + (endTime - startTime));
    }

    /**
     * 单线程
     */
    public void test02() {
        long startTime = System.currentTimeMillis();
        List<Integer> result = new ArrayList<>(10000);
        for (int i = 1; i <= 20000; i++) {
            if (i % 2 == 1) {
                result.add(i);
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("单线程:" + (endTime - startTime));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值