ForkJoinPool 用法实例

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Phaser;
import java.util.concurrent.atomic.AtomicLong;

public class Main {
  static ForkJoinPool executors;
  public static void main(String[] args) throws InterruptedException {
    executors = new ForkJoinPool();
    List<Long> sequence = new ArrayList<>();
    for (int i = 0; i < 20; i++) {
      sequence.add(fib(i));
    }
    System.out.println(sequence);
  }
  private static Long fib(int n) throws InterruptedException {
    AtomicLong result = new AtomicLong();
    Phaser phaser = new Phaser();
    Task initialTask = new Task(n, result, phaser);
    phaser.register();
    executors.submit(initialTask);
    phaser.arriveAndAwaitAdvance();
    return result.get();
  }
}
class Task implements Runnable {
  int index;
  AtomicLong result;
  Phaser phaser;
  public Task(int n, AtomicLong result, Phaser phaser) {
    index = n;
    this.result = result;
    this.phaser = phaser;
    phaser.register();
  }
  @Override
  public void run() {
    if (index == 1) {
      result.incrementAndGet();
    } else if (index > 1) {
      Task task1 = new Task(index - 1, result, phaser);
      Task task2 = new Task(index - 2, result, phaser);
      Main.executors.submit(task1);
      Main.executors.submit(task2);
    }
    phaser.arrive();
  }
}
参考phaser  https://segmentfault.com/a/1190000019685090?utm_source=tag-newest

 

Java中,`ForkJoinPool`和`ForkJoinTask`类可以用于并行执行任务。下面是一个使用`ForkJoinPool`和`ForkJoinTask`的示例: ``` import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; public class ForkJoinExample { public static void main(String[] args) { ForkJoinPool forkJoinPool = new ForkJoinPool(); int result = forkJoinPool.invoke(new SumTask(1, 100)); System.out.println("Sum of 1 to 100 is " + result); } static class SumTask extends RecursiveTask<Integer> { private static final int THRESHOLD = 10; private int from; private int to; public SumTask(int from, int to) { this.from = from; this.to = to; } @Override protected Integer compute() { if (to - from <= THRESHOLD) { int sum = 0; for (int i = from; i <= to; i++) { sum += i; } return sum; } else { int mid = (from + to) / 2; SumTask leftTask = new SumTask(from, mid); SumTask rightTask = new SumTask(mid + 1, to); leftTask.fork(); rightTask.fork(); return leftTask.join() + rightTask.join(); } } } } ``` 在上面的示例中,我们创建了一个`SumTask`类,它继承了`RecursiveTask<Integer>`类。`RecursiveTask`是一个抽象类,我们需要实现`compute()`方法来完成我们的任务。 `SumTask`用于计算从`from`到`to`之间的整数的总和。如果`to - from`小于或等于一个固定的阈值(`THRESHOLD`),则任务将直接计算总和。否则,任务将被拆分成两个子任务并分别计算。我们使用`fork()`方法启动子任务,并使用`join()`方法等待子任务完成并返回结果。 在`main()`方法中,我们创建了一个`ForkJoinPool`来执行我们的任务,并使用`invoke()`方法启动任务。`invoke()`方法将阻塞直到任务完成,并返回结果。最后,我们打印出计算结果。 这是一个简单的使用`ForkJoinPool`和`ForkJoinTask`的示例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值