主程序
package text.ght03;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
public class forkJoinText {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建执行线程池
ForkJoinPool pool = new ForkJoinPool();
//ForkJoinPool pool = new ForkJoinPool(4);
//开始时间
long startTime = System.currentTimeMillis();
//创建任务
SumTask task = new SumTask(1, 2000);
//提交任务
ForkJoinTask result = pool.submit(task);
//等待结果
do {
System.out.printf("Main: Thread Count: %dn",pool.getActiveThreadCount());
System.out.printf("Main: Paralelism: %dn",pool.getParallelism());
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (!task.isDone());
//结束时间
long endTime = System.currentTimeMillis();
//输出结果
System.out.println("程序串行运行时间为 "+(endTime - startTime));
}
}
任务
package text.ght03; import java.util.concurrent.RecursiveTask; public class SumTask extends RecursiveTask{ private int start; private int end; public volatile double[][] d1 = new double[2000][2000]; public volatile double[][] d2 = new double[2000][2000]; public volatile double[][] result = new double[2000][2000];//结果矩阵 public void init() { System.out.println("调用init函数-------"); for (int i = 0; i < 200; i++) { for (int j = 0; j < 200; j++) { d1[i][j] = Math.random(); d2[i][j] = Math.random(); } } } public SumTask(int start, int end) { this.start = start; this.end = end; } public static final int threadhold = 500; @Override protected Long compute() { Long sum = 1L; // 如果任务足够小, 就直接执行 boolean canCompute = (end - start) <= threadhold; if (canCompute) { for (int i = 0; i < 2000; i++) { //实现业务代码 //执行矩阵的加法 for (int j = start - 1; j < end; j++) { //d1[i][j] = Math.random(); //d2[i][j] = Math.random(); d1[i][j] = 1; d2[i][j] = 1; result[i][j] = d1[i][j] + d2[i][j]; } } // for(int i = start -1;i < end ;i++){ // //实现业务代码 // //矩阵的乘法 // for(int j = start -1;j < end;j++){ // for(int k = start -1;k < end;k++){ // // } // } // } System.out.println("线程 "+Thread.currentThread().getName()+" 当前任务的结果:"); for (int i = 0; i < 2000; i++) { for (int j = start - 1; j < end; j++) { //System.out.print(result[i][j] + " "); } //System.out.println(""); } //System.out.println("end"+end); } else { // 任务大于阈值, 分裂为2个任务 int middle = (start + end) / 2; SumTask subTask1 = new SumTask(start, middle); SumTask subTask2 = new SumTask(middle + 1, end); //执行任务 subTask1.fork(); subTask2.fork(); //invokeAll(subTask1, subTask2);//提交两个子任务 //When the subtask 1 thread ends, sum is assigned Long sum1 = subTask1.join(); Long sum2 = subTask2.join(); //结果合并 //sum = sum1 + sum2; } //return sum; return sum; } }



