在我的应用程序中,我必须通过执行许多网络 io 绑定任务和有时一个 io 绑定任务来解决问题,并将其划分为较小的 io 绑定任务。这些任务目前正在使用 Java 的标准线程池机制执行。我想知道我是否可以转向 fork-and-join 框架?但问题是,forkandjoin 框架通常用于解决 io 绑定操作还是 CPU 绑定?我认为它们主要用于 CPU 绑定操作,因为 fork-and-join 框架利用工作窃取技术来利用多核处理器,但是如果我将它用于 IO 绑定任务,会不会有任何不利影响?
问问题
5274 次
3 回答
30
Fork-join 是为计算密集型任务而设计的,所以通常我会说不。Fork-join 确实有一个 API(ManagedBlocker api)来告诉 FJ 框架您的线程将阻塞一段时间而不是排队新任务,但它实际上是为短等待(如获得锁)而设计的,而不是任意长的等待 IO。
我们有一个使用 fork-join 的系统,我们将 IO-bound 任务分流到一个单独的执行器池。当数据到达时,它会触发任务进入 fork-join 池,以便在那里只发生 cpu-bound 工作。
于 2011-11-21T02:01:47.597 回答
2
如果您正在尝试解决问题的“I/O 绑定”方面,我怀疑从标准线程切换到 fork-and-join 是否会改善事情......假设您已经实现了当前基于线程的正确解决。(根据亚历克斯米勒的回答,这种转变实际上可能会使事情变得更糟。)
或者换一种说法,让 I/O 绑定应用程序运行得更快的方法是解决使其受 I/O 绑定的问题……或者增加系统的 I/O 带宽。
于 2011-11-21T02:00:44.863 回答
1
在这种情况下,fork-joins 似乎没有令人信服的优势。
似乎也没有明显的劣势,因为您不会过度使用某些资源。
总而言之,我会一直使用线程池,直到您没有其他重要的开发工作要做。
于 2011-11-21T02:07:28.697 回答