ForkJoinPool 使用的错误写法

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,可以看到这里已经创建太多的守护线程,而且每个线程都处于等待状态。

ForkJoinPool 使用的错误写法_第1张图片


正确做法过程:

将task1置入queue中,当前ForkJoinWorkerThread执行task2,最后停下来等待task1的执行结束。

分析:

当前ForkJoinWorkerThread一直在运行,把需要执行task都直接执行。

充分利用的线程资源,当前ForkJoinWorkerThread也会执行一个task的任务,不会让当前ForkJoinWorkerThread傻等结果。



你可能感兴趣的:(Java基础)