2017-12-13 48 views
7

同時にいくつかのスレッドがコードのセクションを実行しているかを測定しようとしています。 現在、私は(ab)セマフォをこれに使用していますが、より良い方法がありますか?コードを実行しているスレッドの数はどのように測定できますか?

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

代わりSemaphoreAtomicIntegerを使用してください。 Threadクラスで

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.activeCount() 
+1

いいえ、実行中のスレッドの総数を返します。特定のセクションを実行しているスレッドのみをカウントしたい – ChrisBlom

2

AtomicIntegerのためにあなたを助けているstatic方法が良い提案ですが、Java-8以降がされていますの線に沿って

何か高い競争環境ではるかに適しているLongAdderです。

CASが失敗した場合、AtomicIntegerは成功するまでもう一度試行します。 A LongAdderCAS(内部にスピンロックがあります)に失敗した場合、「失敗しました」という値の配列が作成されます(正しく覚えていればCPUの数に制限されます)。最終的に現在の値を要求すると、それらのすべての「失敗した」値が結果に追加されます。この戦略は、AtomicIntegerよりもかなり高速です。

関連する問題