compute分出多个task后:以task1,task2为例
错误做法:
1)依次执行task1.fork(),task2.fork()
2)依次执行task1.join(),task2.join()
正确做法:
1)直接调用invokeAll(task1,task2)
fork():
把task置入当前ForkJoinWorkerThread的queue中,等待被消费
join():
当前ForkJoinWorkerThread执行等待该task执行结束
错误做法过程:
将task1与task2置入queue中,当前ForkJoinWorkerThread停下来等待task1,task2的执行结束。
分析:
当前的ForkJoinWorkerThread可以说join之后什么事情都没有做,只是等待ing。而task1和task2会在新的线程中执行。
会浪费当前ForkJoinWorkerThread的宝贵线程资源。而且最糟糕的是,会创建一个新的ForkJoinWorkerThread去执行新的task,可想而知,如果任务量特别多,那会同时开启特别多的线程。
以上一篇提到的count来看,
打开VisualVM,可以看到这里已经创建太多的守护线程,而且每个线程都处于等待状态。