是否存在与C#分区程序等效的Java

时间:2013-06-10 15:05:44

标签: c# java multithreading partitioning fork-join

在我当前的项目中,我试图在Java中复制以下功能,但我不确定这部分代码究竟在做什么。

// This is C# code
if (numberOfMessages < 10)
{
     // just do it inline it's less expensive than spinning threads
     ReceiveTask(ct, numberOfMessages);
}
else
{
     // use the default partitioner to determine the number of tasks
     Parallel.ForEach(Partitioner.Create(0, numberOfMessages),
           (range) => ReceiveTask(ct, range.Item2 - range.Item1));
}

根据我对评论的分析,我认为当消息数大于10时,代码使用C#的Partitioner函数创建多个线程,其中接收的消息数在线程中“平等”划分。

此外,在此方法的后续部分中,注释引用从RecieveTask接收的消息存储在红黑树中。 RecieveTask方法的评估没有揭示这种排序的任何实现,这引出了分区者是否也这样做的问题。

有人可以确认或更正我对C#Partitioner功能的理解,还能告诉我如何在Java中完成这项任务?我对Java并发库的经验有限,我没有看到这样的选项。

编辑1:

我找到了排序源,RecieveTask将消息添加到SortedSet。

编辑2:

分区程序似乎只将任务划分为组,但它是创建多个线程的Parallel函数。

如果我按照评论中的建议调用Java的ForkJoinPool,这个分区会自动发生,还是我需要自己分工?

如果我必须划分工作量,我将如何使用可变范围的消息调用FutureTask的多个实例?

1 个答案:

答案 0 :(得分:0)

我的建议是你自己分工。

进入线程和并行计算时,没有魔力。所有漂亮和整洁的格式都带有价格 - 只要你意识到它或它隐藏在实现代码中的某个地方。

动态分叉线程似乎不是一个好主意,因为你创建的线程数量不确定,而线程本身就是占用资源的对象。如果你正在进行一些工业项目。我建议使用一个线程池,它在Java中是ExecutorService。然后,如果您不关心执行的顺序,则可以自由调用ExecutorService.invokeAll()。

Java中的红黑树等效是TreeSet / TreeMap,它可以通过调用headSet(),trailSet()和subSet()方法自然地为您提供它的子集。因此,你可能会在这里编写一小部分代码,但在编码风格和性能方面,我觉得非常简单和整洁。