Java多线程ForkJoinPool实例详解
引言
java7提供了另外一个很有用的线程池框架,Fork/Join框架
理论
Fork/Join框架主要有以下两个类组成.
*ForkJoinPool这个类实现了ExecutorService接口和工作窃取算法(Work-StealingAlgorithm).它管理工作者线程,并提供任务的状态信息,以及任务的执行信息
*ForkJoinTask这个类是一个将在ForkJoinPool执行的任务的基类.
Fork/Join框架提供了在一个任务里执行fork()和join()操作的机制和控制任务状态的方法.通常,为了实现Fork/Join任务,需要实现一个以下两个类之一的子类
*RecursiveAction用于任务没有返回值的场景
*RecursiveTask用于任务有返回值的场景.
例子先定个小目标,1亿就太多,先赚个一百万吧
现在你是一个深圳片区的某公司高级销售主管.现在定了一个目标,就是要赚个一百,让你一个人去赚,肯定有难度的.好在有一般手下,把目标缩小,让小弟们去赚,我们坐等拿钱.ok,开始编程
首先我们要定义个赚钱任务MakeMoneyTask,如果要赚钱的目标小于最小目标,比如十万,那么就自己去完成,否则,就把任务分给小弟们去做.
publicclassMakeMoneyTaskextendsRecursiveTask{ privatestaticfinalintMIN_GOAL_MONEY=100000; privateintgoalMoney; privateStringname; privatestaticfinalAtomicLongemployeeNo=newAtomicLong(); publicMakeMoneyTask(intgoalMoney){ this.goalMoney=goalMoney; this.name="员工"+employeeNo.getAndIncrement()+"号"; } @Override protectedIntegercompute(){ if(this.goalMoney tasks=newArrayList<>(); for(inti=0;i makeMoneyTasks=invokeAll(tasks); intsum=0; for(MakeMoneyTaskmoneyTask:makeMoneyTasks){ try{ sum+=moneyTask.get(); }catch(Exceptione){ e.printStackTrace(); } } System.out.println(name+":嗯,不错,效率还可以,终于赚到"+sum+"元,赶紧邀功去...."); returnsum; } } privateIntegermakeMoney(){ intsum=0; intday=1; try{ while(true){ Thread.sleep(ThreadLocalRandom.current().nextInt(500)); intmoney=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(InterruptedExceptione){ e.printStackTrace(); } returnsum; } }
最后我们写一个测试类
publicclassTestMain{ publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException{ ForkJoinPoolpool=newForkJoinPool(); ForkJoinTasktask=pool.submit(newMakeMoneyTask(1000000)); do{ try{ TimeUnit.MILLISECONDS.sleep(5); }catch(InterruptedExceptione){ 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实例详解的全部内容,希望对大家有所帮助。欢迎各位参阅本站其他专题,有什么问题可以随时留言,小编会及时回复大家的。