引言

java 7提供了另外一个很有用的线程池框架,Fork/Join框架
理论
Fork/Join框架主要有以下两个类组成.
* ForkJoinPool 这个类实现了ExecutorService接口和工作窃取算法(Work-Stealing Algorithm).它管理工作者线程,并提供任务的状态信息,以及任务的执行信息
* ForkJoinTask 这个类是一个将在ForkJoinPool执行的任务的基类.
Fork/Join框架提供了在一个任务里执行fork()和join()操作的机制和控制任务状态的方法.通常,为了实现Fork/Join任务,需要实现一个以下两个类之一的子类
* RecursiveAction 用于任务没有返回值的场景
* RecursiveTask 用于任务有返回值的场景.
例子 先定个小目标,1亿就太多,先赚个一百万吧
现在你是一个深圳片区的某公司高级销售主管.现在定了一个目标,就是要赚个一百,让你一个人去赚,肯定有难度的.好在有一般手下,把目标缩小,让小弟们去赚,我们坐等拿钱.ok,开始编程
首先我们要定义个赚钱任务 MakeMoneyTask,如果要赚钱的目标小于最小目标,比如十万,那么就自己去完成,否则,就把任务分给小弟们去做.
public class MakeMoneyTask extends RecursiveTask<Integer>{
private static final int MIN_GOAL_MONEY = 100000;
private int goalMoney;
private String name;
private static final AtomicLong employeeNo = new AtomicLong();
public MakeMoneyTask(int goalMoney){
this.goalMoney = goalMoney;
this.name = "员工" + employeeNo.getAndIncrement() + "号";
}
@Override
protected Integer compute() {
if (this.goalMoney < MIN_GOAL_MONEY){
System.out.println(name + ": 老板交代了,要赚 " + goalMoney + " 元,为了买车买房,加油吧....");
return makeMoney();
}else{
int subThreadCount = ThreadLocalRandom.current().nextInt(10) + 2;
System.out.println(name + ": 上级要我赚 " + goalMoney + ", 有点小多,没事让我" + subThreadCount + "个手下去完成吧," +
"每人赚个 " + Math.ceil(goalMoney * 1.0 / subThreadCount) + "元应该没问题...");
List<MakeMoneyTask> tasks = new ArrayList<>();
for (int i = 0; i < subThreadCount; i ++){
tasks.add(new MakeMoneyTask(goalMoney / subThreadCount));
}
Collection<MakeMoneyTask> makeMoneyTasks = invokeAll(tasks);
int sum = 0;
for (MakeMoneyTask moneyTask : makeMoneyTasks){
try {
sum += moneyTask.get();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println(name + ": 嗯,不错,效率还可以,终于赚到 " + sum + "元,赶紧邀功去....");
return sum;
}
}
private Integer makeMoney(){
int sum = 0;
int day = 1;
try {
while (true){
Thread.sleep(ThreadLocalRandom.current().nextInt(500));
int money = ThreadLocalRandom.current().nextInt(MIN_GOAL_MONEY / 3);
System.out.println(name + ": 在第 " + (day ++) + " 天赚了" + money);
sum += money;
if (sum >= goalMoney){
System.out.println(name + ": 终于赚到 " + sum + " 元, 可以交差了...");
break;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return sum;
}
}
最后我们写一个测试类
public class TestMain {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ForkJoinPool pool = new ForkJoinPool();
ForkJoinTask<Integer> task = pool.submit(new MakeMoneyTask(1000000));
do {
try {
TimeUnit.MILLISECONDS.sleep(5);
}catch (InterruptedException e){
e.printStackTrace();
}
}while (!task.isDone());
pool.shutdown();
System.out.println(task.get());
}
}
运作之后结果如下:
员工0号: 上级要我赚 1000000, 有点小多,没事让我10个手下去完成吧,每人赚个 100000.0元应该没问题… 员工1号: 上级要我赚 100000, 有点小多,没事让我7个手下去完成吧,每人赚个 14286.0元应该没问题… 员工11号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工10号: 上级要我赚 100000, 有点小多,没事让我5个手下去完成吧,每人赚个 20000.0元应该没问题… 员工18号: 老板交代了,要赚 20000 元,为了买车买房,加油吧…. 员工9号: 上级要我赚 100000, 有点小多,没事让我3个手下去完成吧,每人赚个 33334.0元应该没问题… 员工23号: 老板交代了,要赚 33333 元,为了买车买房,加油吧…. 员工22号: 老板交代了,要赚 20000 元,为了买车买房,加油吧…. 员工22号: 在第 1 天赚了31432 员工22号: 终于赚到 31432 元, 可以交差了… 员工21号: 老板交代了,要赚 20000 元,为了买车买房,加油吧…. 员工18号: 在第 1 天赚了32005 员工18号: 终于赚到 32005 元, 可以交差了… 员工19号: 老板交代了,要赚 20000 元,为了买车买房,加油吧…. 员工23号: 在第 1 天赚了6166 员工21号: 在第 1 天赚了15433 员工19号: 在第 1 天赚了23419 员工19号: 终于赚到 23419 元, 可以交差了… 员工20号: 老板交代了,要赚 20000 元,为了买车买房,加油吧…. 员工20号: 在第 1 天赚了10376 员工11号: 在第 1 天赚了11808 员工21号: 在第 2 天赚了31059 员工21号: 终于赚到 46492 元, 可以交差了… 员工8号: 上级要我赚 100000, 有点小多,没事让我4个手下去完成吧,每人赚个 25000.0元应该没问题… 员工26号: 老板交代了,要赚 25000 元,为了买车买房,加油吧…. 员工11号: 在第 2 天赚了11902 员工11号: 终于赚到 23710 元, 可以交差了… 员工12号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工23号: 在第 2 天赚了9077 员工20号: 在第 2 天赚了30386 员工20号: 终于赚到 40762 元, 可以交差了… 员工10号: 嗯,不错,效率还可以,终于赚到 174110元,赶紧邀功去…. 员工7号: 上级要我赚 100000, 有点小多,没事让我10个手下去完成吧,每人赚个 10000.0元应该没问题… 员工30号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 员工12号: 在第 1 天赚了31271 员工12号: 终于赚到 31271 元, 可以交差了… 员工26号: 在第 1 天赚了11631 员工13号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工26号: 在第 2 天赚了10160 员工30号: 在第 1 天赚了10786 员工30号: 终于赚到 10786 元, 可以交差了… 员工31号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 员工31号: 在第 1 天赚了15201 员工31号: 终于赚到 15201 元, 可以交差了… 员工32号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 员工26号: 在第 3 天赚了32642 员工26号: 终于赚到 54433 元, 可以交差了… 员工27号: 老板交代了,要赚 25000 元,为了买车买房,加油吧…. 员工23号: 在第 3 天赚了33072 员工23号: 终于赚到 48315 元, 可以交差了… 员工24号: 老板交代了,要赚 33333 元,为了买车买房,加油吧…. 员工24号: 在第 1 天赚了26309 员工24号: 在第 2 天赚了15420 员工24号: 终于赚到 41729 元, 可以交差了… 员工25号: 老板交代了,要赚 33333 元,为了买车买房,加油吧…. 员工13号: 在第 1 天赚了33266 员工13号: 终于赚到 33266 元, 可以交差了… 员工14号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工25号: 在第 1 天赚了19270 员工25号: 在第 2 天赚了15842 员工25号: 终于赚到 35112 元, 可以交差了… 员工9号: 嗯,不错,效率还可以,终于赚到 125156元,赶紧邀功去…. 员工6号: 上级要我赚 100000, 有点小多,没事让我9个手下去完成吧,每人赚个 11112.0元应该没问题… 员工40号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工32号: 在第 1 天赚了8133 员工32号: 在第 2 天赚了3518 员工32号: 终于赚到 11651 元, 可以交差了… 员工33号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 员工27号: 在第 1 天赚了23200 员工14号: 在第 1 天赚了6366 员工27号: 在第 2 天赚了10406 员工27号: 终于赚到 33606 元, 可以交差了… 员工28号: 老板交代了,要赚 25000 元,为了买车买房,加油吧…. 员工40号: 在第 1 天赚了28078 员工40号: 终于赚到 28078 元, 可以交差了… 员工41号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工41号: 在第 1 天赚了12996 员工41号: 终于赚到 12996 元, 可以交差了… 员工42号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工33号: 在第 1 天赚了29188 员工33号: 终于赚到 29188 元, 可以交差了… 员工34号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 员工14号: 在第 2 天赚了17712 员工14号: 终于赚到 24078 元, 可以交差了… 员工15号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工28号: 在第 1 天赚了18623 员工28号: 在第 2 天赚了8205 员工28号: 终于赚到 26828 元, 可以交差了… 员工29号: 老板交代了,要赚 25000 元,为了买车买房,加油吧…. 员工34号: 在第 1 天赚了30779 员工34号: 终于赚到 30779 元, 可以交差了… 员工35号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 员工42号: 在第 1 天赚了26164 员工42号: 终于赚到 26164 元, 可以交差了… 员工43号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工43号: 在第 1 天赚了2995 员工29号: 在第 1 天赚了347 员工15号: 在第 1 天赚了33056 员工15号: 终于赚到 33056 元, 可以交差了… 员工16号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工35号: 在第 1 天赚了3639 员工29号: 在第 2 天赚了22909 员工43号: 在第 2 天赚了2289 员工16号: 在第 1 天赚了27836 员工16号: 终于赚到 27836 元, 可以交差了… 员工17号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工43号: 在第 3 天赚了694 员工17号: 在第 1 天赚了16361 员工17号: 终于赚到 16361 元, 可以交差了… 员工1号: 嗯,不错,效率还可以,终于赚到 189578元,赶紧邀功去…. 员工2号: 上级要我赚 100000, 有点小多,没事让我2个手下去完成吧,每人赚个 50000.0元应该没问题… 员工49号: 老板交代了,要赚 50000 元,为了买车买房,加油吧…. 员工49号: 在第 1 天赚了8599 员工43号: 在第 4 天赚了10008 员工43号: 终于赚到 15986 元, 可以交差了… 员工44号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工29号: 在第 3 天赚了31298 员工29号: 终于赚到 54554 元, 可以交差了… 员工8号: 嗯,不错,效率还可以,终于赚到 169421元,赶紧邀功去…. 员工39号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 员工49号: 在第 2 天赚了8099 员工35号: 在第 2 天赚了164 员工49号: 在第 3 天赚了5518 员工49号: 在第 4 天赚了22441 员工44号: 在第 1 天赚了6091 员工39号: 在第 1 天赚了18813 员工39号: 终于赚到 18813 元, 可以交差了… 员工48号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工44号: 在第 2 天赚了22324 员工44号: 终于赚到 28415 元, 可以交差了… 员工45号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工49号: 在第 5 天赚了28438 员工49号: 终于赚到 73095 元, 可以交差了… 员工50号: 老板交代了,要赚 50000 元,为了买车买房,加油吧…. 员工35号: 在第 3 天赚了31797 员工35号: 终于赚到 35600 元, 可以交差了… 员工36号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 员工50号: 在第 1 天赚了18071 员工45号: 在第 1 天赚了22528 员工45号: 终于赚到 22528 元, 可以交差了… 员工46号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工36号: 在第 1 天赚了26828 员工36号: 终于赚到 26828 元, 可以交差了… 员工37号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 员工50号: 在第 2 天赚了32422 员工50号: 终于赚到 50493 元, 可以交差了… 员工2号: 嗯,不错,效率还可以,终于赚到 123588元,赶紧邀功去…. 员工3号: 上级要我赚 100000, 有点小多,没事让我9个手下去完成吧,每人赚个 11112.0元应该没问题… 员工51号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工46号: 在第 1 天赚了1537 员工46号: 在第 2 天赚了27529 员工46号: 终于赚到 29066 元, 可以交差了… 员工47号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工48号: 在第 1 天赚了24791 员工48号: 终于赚到 24791 元, 可以交差了… 员工38号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 员工37号: 在第 1 天赚了17587 员工37号: 终于赚到 17587 元, 可以交差了… 员工47号: 在第 1 天赚了23693 员工47号: 终于赚到 23693 元, 可以交差了… 员工6号: 嗯,不错,效率还可以,终于赚到 211717元,赶紧邀功去…. 员工5号: 上级要我赚 100000, 有点小多,没事让我7个手下去完成吧,每人赚个 14286.0元应该没问题… 员工60号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工51号: 在第 1 天赚了27189 员工51号: 终于赚到 27189 元, 可以交差了… 员工52号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工38号: 在第 1 天赚了32285 员工38号: 终于赚到 32285 元, 可以交差了… 员工66号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工7号: 嗯,不错,效率还可以,终于赚到 228718元,赶紧邀功去…. 员工65号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工65号: 在第 1 天赚了26122 员工65号: 终于赚到 26122 元, 可以交差了… 员工64号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工52号: 在第 1 天赚了19239 员工52号: 终于赚到 19239 元, 可以交差了… 员工53号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工60号: 在第 1 天赚了10433 员工66号: 在第 1 天赚了25993 员工66号: 终于赚到 25993 元, 可以交差了… 员工63号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工60号: 在第 2 天赚了19529 员工60号: 终于赚到 29962 元, 可以交差了… 员工61号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工64号: 在第 1 天赚了6894 员工53号: 在第 1 天赚了13114 员工53号: 终于赚到 13114 元, 可以交差了… 员工54号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工54号: 在第 1 天赚了8237 员工61号: 在第 1 天赚了15878 员工61号: 终于赚到 15878 元, 可以交差了… 员工62号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 员工63号: 在第 1 天赚了32108 员工63号: 终于赚到 32108 元, 可以交差了… 员工4号: 上级要我赚 100000, 有点小多,没事让我9个手下去完成吧,每人赚个 11112.0元应该没问题… 员工67号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工64号: 在第 2 天赚了30531 员工64号: 终于赚到 37425 元, 可以交差了… 员工75号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工54号: 在第 2 天赚了13562 员工54号: 终于赚到 21799 元, 可以交差了… 员工55号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工55号: 在第 1 天赚了17774 员工55号: 终于赚到 17774 元, 可以交差了… 员工56号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工67号: 在第 1 天赚了24463 员工67号: 终于赚到 24463 元, 可以交差了… 员工68号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工56号: 在第 1 天赚了1677 员工62号: 在第 1 天赚了14266 员工75号: 在第 1 天赚了26532 员工75号: 终于赚到 26532 元, 可以交差了… 员工74号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工68号: 在第 1 天赚了32639 员工68号: 终于赚到 32639 元, 可以交差了… 员工69号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工69号: 在第 1 天赚了9513 员工56号: 在第 2 天赚了9154 员工56号: 在第 3 天赚了289 员工56号: 终于赚到 11120 元, 可以交差了… 员工57号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工62号: 在第 2 天赚了17321 员工62号: 终于赚到 31587 元, 可以交差了… 员工5号: 嗯,不错,效率还可以,终于赚到 199075元,赶紧邀功去…. 员工59号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工69号: 在第 2 天赚了17971 员工69号: 终于赚到 27484 元, 可以交差了… 员工70号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工74号: 在第 1 天赚了26270 员工74号: 终于赚到 26270 元, 可以交差了… 员工73号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工70号: 在第 1 天赚了21237 员工70号: 终于赚到 21237 元, 可以交差了… 员工71号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工59号: 在第 1 天赚了4411 员工57号: 在第 1 天赚了3546 员工57号: 在第 2 天赚了29330 员工57号: 终于赚到 32876 元, 可以交差了… 员工58号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工73号: 在第 1 天赚了10674 员工71号: 在第 1 天赚了8821 员工59号: 在第 2 天赚了11887 员工59号: 终于赚到 16298 元, 可以交差了… 员工72号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 员工58号: 在第 1 天赚了28241 员工58号: 终于赚到 28241 元, 可以交差了… 员工3号: 嗯,不错,效率还可以,终于赚到 187650元,赶紧邀功去…. 员工72号: 在第 1 天赚了14371 员工72号: 终于赚到 14371 元, 可以交差了… 员工73号: 在第 2 天赚了14918 员工73号: 终于赚到 25592 元, 可以交差了… 员工71号: 在第 2 天赚了28814 员工71号: 终于赚到 37635 元, 可以交差了… 员工4号: 嗯,不错,效率还可以,终于赚到 236223元,赶紧邀功去…. 员工0号: 嗯,不错,效率还可以,终于赚到 1845236元,赶紧邀功去…. 1845236
看到没有,员工0号把任务一百万直接分给了10个手下去做,每个手下有继续往下分,最终在七十几号人的努力下,终于完成了目标–一百万.而且还超出八十多万,老板一开心,直接把八十多万分给这七十多个员工分红了.
后记
通过上面这个例子的学习,相信应该很多人都可以掌握ForkJoinPool这个类,它的核心就是要完成某一个目标任务,如果目标任务太大,那么就创建多个子任务.然后一直等待这些子任务完成.最终完成之前定下的目标任务.
总结
以上就是本文关于Java多线程ForkJoinPool实例详解的全部内容,希望对大家有所帮助。欢迎各位参阅本站其他专题,有什么问题可以随时留言,小编会及时回复大家的。
# java
# 多线程实例
# 多线程开发实例
# Java中使用ForkJoinPool的实现示例
# Java线程池ForkJoinPool(工作窃取算法)的使用
# Java线程池ForkJoinPool实例解析
# Java ForkJoinPool线程池的使用之并行计算数组求和实例
# Java CompletableFuture与ForkJoinPool的关系及说明
# Java中的ForkJoinPool使用方法详解(附案例)
# 赚了
# 赚到
# 买车
# 差了
# 加油吧
# 让我
# 还可以
# 要我
# 去做
# 十多
# 返回值
# 是一个
# 有什么
# 有一
# 让你
# 太多
# 你是
# 多个
# 子类
# 将在
相关文章:
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
,想在网上投简历,哪几个网站比较好?
nginx修改上传文件大小限制的方法
简历在线制作网站免费版,如何创建个人简历?
如何注册花生壳免费域名并搭建个人网站?
制作网站的模板软件,网站怎么建设?
如何快速搭建响应式可视化网站?
广平建站公司哪家专业可靠?如何选择?
如何在阿里云通过域名搭建网站?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
建站VPS选购需注意哪些关键参数?
平台云上自助建站如何快速打造专业网站?
建站主机如何选?高性价比方案全解析
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
c# 服务器GC和工作站GC的区别和设置
如何在宝塔面板中创建新站点?
家具网站制作软件,家具厂怎么跑业务?
建站10G流量真的够用吗?如何应对访问高峰?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
建站上传速度慢?如何优化加速网站加载效率?
如何在阿里云虚拟服务器快速搭建网站?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
微课制作网站有哪些,微课网怎么进?
如何用美橙互联一键搭建多站合一网站?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
利用JavaScript实现拖拽改变元素大小
如何在局域网内绑定自建网站域名?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
专业网站建设制作报价,网页设计制作要考什么证?
微信推文制作网站有哪些,怎么做微信推文,急?
ui设计制作网站有哪些,手机UI设计网址吗?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
公众号网站制作网页,微信公众号怎么制作?
模具网站制作流程,如何找模具客户?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
如何通过虚拟主机快速完成网站搭建?
如何通过万网虚拟主机快速搭建网站?
已有域名和空间如何搭建网站?
如何高效搭建专业期货交易平台网站?
如何通过FTP空间快速搭建安全高效网站?
如何在阿里云ECS服务器部署织梦CMS网站?
如何用PHP快速搭建CMS系统?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
建站之星代理商如何保障技术支持与售后服务?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
官网网站制作腾讯审核要多久,联想路由器newifi官网
文字头像制作网站推荐软件,醒图能自动配文字吗?
*请认真填写需求信息,我们会在24小时内与您取得联系。