Java的fork-and-join线程池是否适合执行IO绑定任务?

在我的应用程序中,我必须通过执行许多network-io绑定任务来解决问题,有时一个io绑定任务并分成更小的io绑定任务。 这些任务目前正在使用Java的标准线程池机制执行。 我想知道我是否可以转向fork-and-join框架? 但问题是,forkandjoin框架通常用于解决io绑定操作或CPU绑定吗? 我假设它们主要用于CPU绑定操作,因为fork-and-join框架利用工作窃取技术来利用多核处理器,但如果我将它用于IO绑定任务,会不会有任何不利影响?

Fork-join是为计算绑定任务而设计的,所以我通常会说不。 fork-join确实有一个API( ManagedBlocker api)来告诉FJ框架你的线程会暂时阻塞而不是排队新任务但是它真的是为了等待很短的时间(比如获得一个锁),而不是任意长等待IO。

我们有一个使用fork-join的系统,我们将IO绑定任务分流到一个单独的执行器池。 当数据到达时,它会将任务触发到fork-join池中,以便只在那里发生cpu绑定的工作。

如果你试图解决你的问题的“I / O绑定”方面,我怀疑从标准线程切换到fork-and-join会改善一些事情……假设你已经实现了当前基于线程的解决方案。 (根据Alex Miller的回答,这个转换实际上会让事情变得更糟。)

或者换句话说,使I / O绑定应用程序更快的方法是解决使其受I / O限制的问题……或者增加系统的I / O带宽。

在这种情况下,fork-joins似乎没有令人信服的优势。

似乎没有显着的缺点,因为你不会太努力地驾驶一些资源。

总而言之,我会留在线程池中,直到你没有其他重要的开发要做。