什么是从并行评估切换到顺序评估的简洁方法?

时间:2014-02-20 02:27:49

标签: java multithreading parallel-processing

在一种分而治之的算法中,如果

将分开的问题片段发送到单独的线程中是有意义的
  1. 每件都足够大
  2. 还没有很多线程在运行。
  3. 简单示例:在合并排序中,给定50,000,000个元素列表,将前半部分发送到一个线程而将第二个发送到另一个线程是有意义的,等等几次,但在某些时候(可能在最多四个之后)在一台典型的PC上拆分,我想,这会导致线程开销超过任何收益。编写代码以从分裂线程转换到不执行此操作的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

您遇到的问题可以通过使用Java的Fork / Join Framework来解决。 Here is an example。 ForkJoinPool不会产生很多线程,而是在有些线程等待的时候重用它们。 FJP的创建完全是为了解决分歧和征服问题。

答案 1 :(得分:0)

“将前半部分发送到一个线程而第二部分发送到另一个线程是有意义的” - 不,因为每个线程的确切时间可能会有所不同。结果,一个线程完成,第二个线程单独继续,从而降低了并行性。

所以要求是:

  1. 每件都足够大,并且有很多,以保持处理器有效负载的平衡

  2. 还没有很多线程在运行,因为许多线程只消耗内存而不提高性能。

  3. 结果,工作数量!=线程数。这意味着应该使用线程池。将工作拆分成碎片与选择线程池的大小无关。一块越大,切换越少,但平衡越少。根据经验,应该有> 100件,每件执行1到1000毫秒。线程池的一侧是可用处理器的数量,如果工作是I / O,则乘以某个因子。