一、钩子方法是每个子任务都会执行一次,还是只有最终任务结束时,执行一次?

每个任务执行,都会调用一次钩子任务。

二、forkjoin需要指定线程数吗?默认情况下任务队列先进先出?

可以指定线程数。先进后出

三、具体和普通线程池有本质区别吗

没有本质区别。是对传统线程池的加强。增加了任务窃取功能。

四、是否可以应用于读大文件。

不可以,用于计算密集型。

五、工作线程总是从头部获取任务,窃取线程从尾部获取任务,为什么这么设计,?

主要原因是为了提高性能,通过始终选择最近提交的任务,增加资源仍分配在CPU缓存中的机会,这样CPU处理起来要快一些。
窃取者之所以从尾部获取任务,则是为了降低线程之间的竞争可能,毕竟大家都从一个部分拿任务,竞争的可能要大很多。
此外,这样的设计还有一种考虑。由于任务是可分割的,那队列中较旧的任务最有可能粒度较大,因为它们可能还没有被分割,而空闲的线程则相对更有“精力”来完成这些粒度较大的任务。