2017-12-13 17 views
7

Ich versuche zu messen, wie viele Threads einen Codeabschnitt zur gleichen Zeit ausführen. Momentan bin ich (ab) mit Semaphoren dafür, gibt es einen besseren Weg?Wie kann ich messen, wie viele Threads einen Code ausführen?

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 

Antwort

5

Verwenden Sie ein AtomicInteger anstelle eines Semaphore.

Etwas entlang der Linien von:

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

In der Thread Klasse gibt es eine static Methode, die Sie für dieses

Thread.activeCount() 
+1

Nein, das gibt die Gesamtzahl der laufenden Threads zurück, ich möchte nur die Threads zählen, die einen bestimmten Abschnitt ausführen – ChrisBlom

2

AtomicInteger hilft ist guter Vorschlag, aber da Java-8 gibt ist LongAdder das ist viel besser geeignet in Umgebungen mit hoher Konkurrenz.

Der Unterschied ist, dass, wenn ein CAS fehlschlägt, AtomicInteger wird es erneut versuchen - bis es erfolgreich ist. A LongAdder wenn es CAS fehlschlägt (es gibt eine Spin-Lock-Funktion), erstellt ein Array der Werte, die "fehlgeschlagen" (begrenzt auf die Anzahl der CPUs, wenn ich mich richtig erinnere). Wenn Sie schließlich den aktuellen Wert anfordern, werden alle diese "fehlgeschlagenen" Werte zum Ergebnis hinzugefügt. Diese Strategie erweist sich als schneller als AtomicInteger.

Verwandte Themen