Java Fork/Join框架

2018-02-28 16:11 更新

Java線程教程 - Java Fork/Join框架


fork/join框架通過利用機(jī)器上的多個處理器或多個內(nèi)核來解決問題。

該框架有助于解決涉及并行性的問題。

fork/join框架創(chuàng)建一個線程池來執(zhí)行子任務(wù)。

當(dāng)線程在子任務(wù)上等待完成時,框架使用該線程來執(zhí)行其他線程的其他未決子任務(wù)。

java.util.concurrent包中的以下四個類是學(xué)習(xí)fork/join框架的核心:

  • ForkJoinPool
  • ForkJoinTask
  • RecursiveAction
  • RecursiveTask

ForkJoinPool類的一個實例表示一個線程池。 ForkJoinTask類的一個實例表示一個任務(wù)。

ForkJoinTask類是一個抽象類。它有兩個具體的子類:RecursiveAction和RecursiveTask。

Java 8添加了一個稱為CountedCompleter的ForkJoinTask類的抽象子類。

該框架支持兩種類型的任務(wù):不產(chǎn)生結(jié)果的任務(wù)和產(chǎn)生結(jié)果的任務(wù)。

RecursiveAction類的實例表示不產(chǎn)生結(jié)果的任務(wù)。 RecursiveTask類的實例表示產(chǎn)生結(jié)果的任務(wù)。

CountedCompleter任務(wù)可能產(chǎn)生結(jié)果,也可能不產(chǎn)生結(jié)果。

這兩個類,RecursiveAction和RecursiveTask,提供了一個抽象的compute()方法。

我們應(yīng)該繼承這些類之一,并為compute()方法提供一個實現(xiàn)。

例子

ForkJoinTask類的以下兩個方法在任務(wù)執(zhí)行期間提供了兩個重要的功能:

fork()方法從異步執(zhí)行的任務(wù)啟動一個新的子任務(wù)。join()方法讓任務(wù)等待另一個任務(wù)完成。

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

public class Main {
  public static void main(String[] args) {
    ForkJoinPool pool = new ForkJoinPool();
    IntSum task = new IntSum(3);
    long sum = pool.invoke(task);
    System.out.println("Sum is " + sum);
  }
}

class IntSum extends RecursiveTask<Long> {
  private int count;
  public IntSum(int count) {
    this.count = count;
  }

  @Override
  protected Long compute() {
    long result = 0;

    if (this.count <= 0) {
      return 0L; 
    }else if (this.count == 1) {
      return (long) this.getRandomInteger();
    }
    List<RecursiveTask<Long>> forks = new ArrayList<>();
    for (int i = 0; i < this.count; i++) {
      IntSum subTask = new IntSum(1);
      subTask.fork(); // Launch the subtask
      forks.add(subTask);
    }
    // all subtasks finish and combine the result
    for (RecursiveTask<Long> subTask : forks) {
      result = result + subTask.join();
    }
    return result;
  }

  public int getRandomInteger() {
    return 2;
  }
}

上面的代碼生成以下結(jié)果。



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號