在我当前的项目中,我试图在 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:
分区程序似乎只是将任务分组,但创建多个线程的是并行函数。
如果我按照评论中的建议调用 Java 的 ForkJoinPool,这个分区会自动发生,还是我需要自己分工?
如果我必须划分工作量,我将如何调用具有可变消息范围的 FutureTask 的多个实例?
最佳答案
我的建议是你自己分工。
谈到线程和并行计算时,没有魔法。所有漂亮整洁的格式都有价格 - 如果您意识到它或者它隐藏在实现代码中的某个地方。
在我看来,动态 fork 线程并不是一个好主意,因为您正在创建的线程数量不确定,而且线程本身就是占用资源的对象。如果你在做一些工业项目。我建议使用线程池,在 Java 中是 ExecutorService。如果您不关心执行顺序,则可以自由调用 ExecutorService.invokeAll() 。
Java 中的红黑树等价物是 TreeSet/TreeMap,通过调用 headSet()、trailSet() 和 subSet() 方法可以自然地为您提供它的子集。因此,您可能会在这里进行少量编码,但在我看来,无论是编码风格还是性能,一切都非常简单和整洁。
关于c# - 是否有与 C# 分区程序等效的 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17027008/