所以這看起來像是一個非常常見的用例,也許我在想它,但是我在保持多線程集中度量方面存在問題。假設我有多個工作線程的所有處理記錄,並且我想每隔1000條記錄吐出一些指標。現在我可以讓每個線程都記錄單個度量標準,但是然後獲得吞吐量數字,但我不得不手動添加它們(當然時間邊界將不準確)。這裏有一個簡單的例子:來自多個線程的指標
public class Worker implements Runnable {
private static int count = 0;
private static long processingTime = 0;
public void run() {
while (true) {
...get record
count++;
long start = System.currentTimeMillis();
...do work
long end = System.currentTimeMillis();
processingTime += (end-start);
if (count % 1000 == 0) {
... log some metrics
processingTime = 0;
count = 0;
}
}
}
}
希望有道理。另外我知道兩個靜態變量可能是AtomicInteger和AtomicLong。 。 。但也許不是。對人們有什麼樣的想法感興趣。我曾考慮過使用原子變量和使用ReeantrantReadWriteLock--但我真的不希望指標停止處理流程(即指標應該對處理的影響非常小)。謝謝。
+1,但我總是懷疑這樣的解決方案。因爲實際上是實現你想要的?也就是說,操作系統允許此日誌記錄的線程搶佔成本會減少其他工作線程實現的度量數量(如果number_of_working_threads> cores_on_machine,這只是一個有效問題)。在您已經獲得指標後,不要在同一個線程上執行此操作。 – 2011-05-18 15:50:48
確實,這在某些條件下效果最好。我會稍微修改您的條件爲number_of_CPU_busy_threads> cores_on_machine。實際上,很多線程將處理時間的大部分花費在空閒狀態(I/O等被阻塞)。在大多數情況下,真正活動的線程數量不會超過內核數量,否則無論如何你實際上都超過了CPU容量。如果動作的本質是「序列化」(例如記錄到文件),這種模式也可以很好地工作。 – sjlee 2011-05-18 16:56:41
我真的很喜歡這個答案 - 不能說它將如何影響蝙蝠的處理時間,但我的猜測是指標線程將保持非常繁忙,而不會影響運行記錄處理器。 – Gandalf 2011-05-18 19:32:52