2

私の現在のプロジェクトでは、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 の複数のインスタンスをどのように呼び出すのでしょうか?

4

1 に答える 1

0

私の提案は、自分で作業を分割することです。

スレッド化と並列コンピューティングに関して言えば、魔法はありません。素敵できちんとしたフォーマットにはすべて代償が伴います - あなたがそれを認識しているか、実装コードのどこかに隠されている場合に限ります。

作成しているスレッドの数が不確実であり、スレッド自体がリソースを使用するオブジェクトであるため、動的にスレッドをフォークすることは私には良い考えではないようです。あなたがいくつかの産業プロジェクトに参加している場合。Java では ExecutorService であるスレッド プールを使用することをお勧めします。その後、実行の順序を気にしない場合は、 ExecutorService.invokeAll() を自由に呼び出すことができます。

Java で赤黒木に相当するのは TreeSet/TreeMap で、headSet()、trailSet()、および subSet() メソッドを呼び出すことで自然にそのサブセットを提供できます。したがって、ここでは少量のコーディングしかできませんが、コーディング スタイルとパフォーマンスの両方において、すべてが非常にシンプルできちんとしているように思えます。

于 2013-07-04T04:19:01.250 に答える