是否有与c#分区相同的Java分区?

本文关键字:分区 Java 是否 | 更新日期: 2023-09-27 18:17:49

在我当前的项目中,我试图在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#分区函数的理解,并给我一些关于如何在Java中完成此任务的想法?我使用Java并发库的经验有限,我没有看到这样的选项可用。

编辑1:

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

编辑2:

看起来分区器只是将任务分成组,但是创建多个线程的是Parallel函数。

如果我像评论中建议的那样调用Java的ForkJoinPool,这个分区会自动发生吗,还是我需要自己划分工作?

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

是否有与c#分区相同的Java分区?

我建议你自己分工。

当谈到线程和并行计算时,没有什么神奇的。所有漂亮整洁的格式都是有代价的——只要你意识到它,或者它隐藏在实现代码的某个地方。 动态分叉线程对我来说似乎不是一个好主意,因为你正在创建的线程数量的不确定性,线程本身就是占用资源的对象。如果你在做一些工业项目。我建议使用线程池,在Java中是ExecutorService。然后,如果您不关心执行的顺序,则可以自由地调用ExecutorService.invokeAll()。

红黑树在Java中的等效是TreeSet/TreeMap,它可以通过调用headSet(), trailSet()和子集()方法自然地给你一个子集。因此,您可能需要编写少量代码,但在我看来,无论是编码风格还是性能,都非常简单和整洁。