用于db访问的java fork-join执行器用法

时间:2015-02-26 21:54:24

标签: java parallel-processing executorservice fork-join forkjoinpool

ForkJoinTask 显式调出"可分段任务也不应执行阻止I / O "。它的主要目标是计算纯函数或对纯粹孤立的对象进行操作" 计算任务"。我的问题是: -

  1. 为什么设计ForkJoinTask来限制阻塞IO任务?
  2. 如果我实施阻止IO任务会有什么问题?
  3. 对于数据库调用,使用fork-join执行程序的spring和play框架是如何充满示例的?
  4. 在我的场景中,单个请求执行两种类型的工作,其中一种是加密,将CPU内核推送到100%,持续200 ms,其次是几次数据库调用。任何类型的静态分区(例如用于加密的6个线程和用于阻塞IO的2个线程)都不会提供CPU的最佳使用。因此,拥有一个fork-join执行程序,在总CPU数量上具有一定数量的线程过度配置,再加上工作窃取,将确保更好地利用CPU资源。

    我对forkjoin执行者的上述假设和理解是否正确,如果没有,请指出我的差距。

2 个答案:

答案 0 :(得分:1)

  

为什么设计ForkJoinTask来限制阻塞IO任务?

fork连接池的基础是共享线程数量,如果这些线程上有一些IO工作阻塞,那么CPU密集型工作的线程就会减少。其他没有阻挡的工作会饿死。

  

如果我实施阻止IO任务会有什么问题?

通常,FJPool分配了关于处理器数量的线程。因此,如果您必须在线程上使用IO阻止,请确保为其他任务分配足够的线程。

您还可以在未与FJ池共享的专用线程上延迟IO工作。但是你调用blocking IO,你的线程会阻塞并安排其他任务,直到解锁

  

如何使用用于数据库调用的fork-join执行程序的spring和play框架?

play也不例外。他们使用专用的pools进行IO任务,因此其他任务不会受到影响。

答案 1 :(得分:-1)

框架不限制任何类型的处理。我不建议做阻塞等。几年前我写了一个关于这个框架的评论,这里是recommendations.的观点,这是针对Java7版本的,但它仍然适用于Java8。

阻止不是致命的,冲刺和游戏阻止,他们工作得很好。使用Java8时需要小心,因为存在默认的公共分支/连接池并且绑定线程可能会对其他用户产生影响。你总是可以用额外的开销定义你自己的f / j池,但至少你不会干扰使用公共池的其他人。

你的情景看起来不错。你不是在等待来自互联网的回复。试试看。如果遇到线程停滞困难,请查看ForkJoinPool.ManagedBlocker接口。使用该接口通知f / j池你正在阻塞调用,框架将创建补偿线程。