首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >fork/join演示

fork/join演示

原创
作者头像
用户11731656
修改2025-07-05 07:42:49
修改2025-07-05 07:42:49
1400
举报
代码语言:java
复制
public class CountTask extends RecursiveTask<Integer> {
    private static final int THRESHHOLD = 2;
    private int start;
    private int end;

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

    @Override
    protected Integer compute() {
        System.out.println(start + " - " + end + " begin");
        int sum = 0;
        boolean canCompute = (end - start) <= THRESHHOLD;
        if (canCompute) { // 达到了计算条件,则直接执行
            System.out.println(start + " - " + end + " canCompute");
            for (int i = start; i <= end; i++) {
                sum += i;
            }
        } else { // 不满足计算条件,则分割任务
            int middle = (start + end) / 2;

            CountTask leftTask = new CountTask(start, middle);
            CountTask rightTask = new CountTask(middle + 1, end);

            leftTask.fork(); // 执行子任务
            rightTask.fork(); // 执行子任务
            int leftResult = leftTask.join(); // 等待子任务执行完毕
            int rightResult = rightTask.join(); // 等待子任务执行完毕

            sum = leftResult + rightResult; // 合并子任务的计算结果
        }
        System.out.println(start + " - " + end + " end");
        return sum;
    }

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ForkJoinPool pool = new ForkJoinPool();
        CountTask task = new CountTask(1, 8);
        Future<Integer> future = pool.submit(task);
        if (task.isCompletedAbnormally()) {
            System.out.println(task.getException());
        } else {
            System.out.println("result: " + future.get());
        }
        pool.shutdown();
    }

}

代码语言:java
复制
public class FileSearchTask extends RecursiveAction {
    private final File directory;

    public FileSearchTask(File directory) {
        this.directory = directory;
    }

    @Override
    protected void compute() {
        File[] files = directory.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    // 如果是目录,创建子任务
                    FileSearchTask task = new FileSearchTask(file);
                    task.fork();
                } else {
                    // 处理文件
                    System.out.println(file.getAbsolutePath());
                }
            }
            // 等待所有子任务完成
            invokeAll();
        }
    }

    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();
        pool.invoke(new FileSearchTask(new File("F:\\常用软件"))); //执行任务并等待结果
        pool.shutdown();
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档