2017-12-13 132 views
7

मैं यह मापने की कोशिश कर रहा हूं कि एक ही समय में कोड के एक अनुभाग को कितने धागे निष्पादित कर रहे हैं। वर्तमान में मैं (एबी) इस के लिए सेमफोर का उपयोग कर रहा हूं, क्या कोई बेहतर तरीका है?मैं कैसे माप सकता हूं कि कोड के टुकड़े को कितने धागे निष्पादित कर रहे हैं?

final int MAX_THREADS = Integer.MAX_VALUE; 

Semaphore s = new Semaphore(MAX_THREADS); 

s.acquire(); // start of section 

// do some computations 

// track how many threads are running the section 
trackThreads((MAX_THREADS - s.availablePermits()));   

s.release(); // end of section 

उत्तर

5

उपयोग एक Semaphore के बजाय एक AtomicInteger। की तर्ज पर

कुछ:

AtomicInteger count = new AtomicInteger(); 

count.getAndIncrement(); 

// do some computations 

// track how many threads are running the section 
trackThreads(count.get());   

count.getAndDecrement(); // end of section 
-2

Thread वर्ग में एक static विधि है कि आप इस

Thread.activeCount() 
+1

नहीं, जो चलने वाले धागे की कुल संख्या देता है, मैं केवल उस थ्रेड को गिनना चाहता हूं जो किसी विशेष सेक्शन को निष्पादित कर रहा है – ChrisBlom

2

AtomicInteger के लिए मदद कर रहा है है अच्छा सुझाव है, लेकिन जब से जावा-8 वहाँ LongAdder है जो उच्च संकुचित वातावरण में काफी बेहतर है।

अंतर यह है कि जब CAS विफल रहता है, AtomicInteger फिर से प्रयास करेगा - जब तक यह सफल नहीं होगा। LongAdder जब यह CAS (अंदर एक स्पिन लॉक) में विफल रहता है, तो "असफल" मानों की एक सरणी तैयार करेगा (यदि मुझे सही याद है तो CPU की संख्या तक सीमित)। जब आप आखिरकार इसके वर्तमान मूल्य का अनुरोध करते हैं - परिणामस्वरूप उन सभी "असफल" मान जोड़े जाते हैं। यह रणनीति AtomicInteger से काफी तेज साबित हुई है।

संबंधित मुद्दे