簡體   English   中英

是否有Java等效於C#分區程序

[英]Is there a Java equivalent to the C# partitioner

在我當前的項目中,我試圖用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接收的消息,這些消息存儲在Red Black Tree中。 對RecieveTask方法的評估沒有揭示這種排序的任何實現方式,這引起了分區程序是否也執行此操作的問題。

有人可以確認或糾正我對C#Partitioner函數的理解,也可以給我一些如何在Java中完成此任務的想法嗎? 我對Java並發庫的經驗有限,我沒有看到這樣的選項。

編輯1:

我已經找到排序的來源,RecieveTask將消息添加到SortedSet。

編輯2:

似乎分區程序只是將任務划分為幾組,但是Parallel函數創建了多個線程。

如果按照注釋中的建議調用Java的ForkJoinPool,該分區會自動發生,還是我需要自己划分工作?

如果必須分擔工作量,我如何用可變的消息范圍調用FutureTask的多個實例?

我的建議是您自己分工。

當談到線程和並行計算時,沒有魔術。 所有漂亮而整潔的格式都附帶有價格-只要您意識到它還是隱藏在實現代碼中的某個位置即可。

在我看來,動態分叉線程並不是一個好主意,因為您正在創建的線程數量不確定,並且線程本身就是占用資源的對象。 如果您正在從事某些工業項目。 我建議使用線程池,在Java中為ExecutorService。 然后,如果您不關心執行順序,則可以自由調用ExecutorService.invokeAll()。

Java中等效的紅黑樹是TreeSet / TreeMap,通過調用headSet(),trailSet()和subSet()方法自然可以為您提供它的子集。 因此,在這里您可能只需要少量的編碼,但是在我看來,無論是在編碼樣式還是性能上,一切都非常簡單明了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM