Java:ForkJoinPool的简单使用
Posted 你是小KS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java:ForkJoinPool的简单使用相关的知识,希望对你有一定的参考价值。
1. 声明
当前内容主要为本人学习和复习之用,主要为ForkJoinPool的简答使用,主要参考:官方文档
2. 基本demo
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.TimeUnit;
/**
*
* @author hy
* @createTime 2021-07-04 10:08:54
* @description 当前内容主要为测试和使用ForkJoinPool
*
*/
public class ForkJoinPoolTest {
static class MyJob extends RecursiveAction {
int time = 1000;
int needFinishTime; // 总共需要多长时间去完成
public MyJob(int needFinishTime) {
this.needFinishTime = needFinishTime;
}
// 将一个任务的完成写在最后面去执行
@Override
protected void compute() {
// TODO Auto-generated method stub
if (needFinishTime > time) {
System.out.println("wait to complete");
// 将一个任务直接分成多分去执行完成
int count = needFinishTime / time;
count = needFinishTime % time == 0 ? count : count + 1;
MyJob[] jobs = new MyJob[count];
for (int i = 0; i < count; i++) {
if (i < count - 1) {
jobs[i] = new MyJob(time);
} else {
int cTime = needFinishTime - time * (i);
//System.out.println(cTime);
jobs[i] = new MyJob(cTime);
}
}
System.out.println("jobs的长度为:" + jobs.length);
// 可以使用并行计算的方式执行任务,将一个任务分解为多个任务执行
invokeAll(jobs);
} else {
try {
Thread.sleep(this.needFinishTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String name = Thread.currentThread().getName();
System.out.println(name + ":direct complete");
}
}
}
public static void main(String[] args) {
ForkJoinPool pool = new ForkJoinPool();
pool.invoke(new MyJob(2000));
pool.invoke(new MyJob(1000));
try {
pool.awaitTermination(3000L, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
pool.shutdown();
}
}
}
执行的结果:
这里的ForkJoinPool的主要部分就是compute,需要按照自己的计算方式将一个任务递归的方式分成若干个部分来实际执行(多线程方式并行执行),再执行的时候提高了效率
以上是关于Java:ForkJoinPool的简单使用的主要内容,如果未能解决你的问题,请参考以下文章
java笔记java中线程池之ForkJoinPool的原理及使用
JAVA 递归线程池 ExecutorService / ForkJoinPool