c# - 是否有与 C# 分区程序等效的 Java

标签 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:

分区程序似乎只是将任务分组,但创建多个线程的是并行函数。

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

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

最佳答案

我的建议是你自己分工。

谈到线程和并行计算时,没有魔法。所有漂亮整洁的格式都有价格 - 如果您意识到它或者它隐藏在实现代码中的某个地方。

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

Java 中的红黑树等价物是 TreeSet/TreeMap,通过调用 headSet()、trailSet() 和 subSet() 方法可以自然地为您提供它的子集。因此,您可能会在这里进行少量编码,但在我看来,无论是编码风格还是性能,一切都非常简单和整洁。

关于c# - 是否有与 C# 分区程序等效的 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17027008/

相关文章:

c# - 使用 DotNetOpenAuth 以双向方式将一个站点连接到另一个站点

c# - Unity 5 - Playerprefs 保存在统一但不是在 android 上?

c# - 无论如何在 linq to entities 查询中生成自定义 sql?

java - 使用变量值作为另一个原始变量的标识符

java - 用于配置测试的自定义注释

Java多线程意外结果

c# - Int to Decimal Conversion - 在指定位置插入小数点

java - 询问用户三个名字并按字母顺序打印

c# - BackgroundWorker 奇怪的问题

c - 子线程中的 malloc 占用太多虚拟内存