私の現在のプロジェクトでは、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# のパーティショナー関数を使用して、受信されるメッセージの数がスレッド間で「均等に」分割される複数のスレッドを作成すると考えています。
さらに、このメソッドの後半のセクションでは、コメントが Red Black Tree に格納されている RecieveTask から受信したメッセージを参照します。RecieveTask メソッドの評価では、そのような並べ替えの実装は明らかにされず、Partitioner もこれを行うかどうかという疑問が生じます。
誰かが C# パーティショナー機能についての私の理解を確認または修正し、Java でこのタスクを達成する方法についてのアイデアを教えてもらえますか? Java 並行ライブラリーに関する私の経験は限られており、そのようなオプションが利用できるとは思いませんでした。
編集1:
並べ替えのソースが見つかりました。RecieveTask はメッセージを SortedSet に追加します。
編集2:
パーティショナーはタスクをグループに分割しているだけのように見えますが、複数のスレッドを作成するのは Parallel 関数です。
コメントで提案されているように Java の ForkJoinPool を呼び出すと、このパーティショニングは自動的に行われますか、それとも自分で作業を分割する必要がありますか?
作業量を分割する必要がある場合、可変範囲のメッセージで FutureTask の複数のインスタンスをどのように呼び出すのでしょうか?