在我当前的项目中,我试图在 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 方法的评估没有揭示这种排序的任何实现,这引出了 Partitioner 是否也这样做的问题。
有人可以确认或更正我对 C# Partitioner 功能的理解,并给我一些关于如何在 Java 中完成此任务的想法吗?我对 Java 并发库的经验是有限的,我没有看到这样的选项可用。
编辑1:
我找到了排序的来源,RecieveTask 将消息添加到 SortedSet。
编辑2:
似乎分区器只是将任务分成组,但创建多个线程的是 Parallel 函数。
如果我按照评论中的建议调用 Java 的 ForkJoinPool,这种分区会自动发生,还是我需要自己划分工作?
如果我必须划分工作量,我将如何调用具有可变消息范围的 FutureTask 的多个实例?