2017-12-13 177 views
7

Tôi đang cố gắng đo lường có bao nhiêu luồng đang thực thi một phần mã cùng một lúc. Hiện tại tôi đang (ab) sử dụng Semaphores cho việc này, có cách nào tốt hơn không?Làm cách nào để có thể đo lường số lượng chuỗi đang thực thi một đoạn mã?

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 

Trả lời

5

Sử dụng số AtomicInteger thay vì Semaphore.

cái gì đó dọc theo dòng:

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

Trong lớp Thread có một phương pháp static rằng đang giúp bạn cho việc này

Thread.activeCount() 
+1

Không, điều đó trả về tổng số chủ đề đang chạy, tôi chỉ muốn đếm các chuỗi đang thực hiện một phần cụ thể – ChrisBlom

2

AtomicInteger là gợi ý tốt, nhưng kể từ java-8 có là LongAdder phù hợp hơn nhiều trong môi trường có nhiều cạnh tranh.

Sự khác biệt là khi CAS không thành công, AtomicInteger sẽ thử lại - cho đến khi thành công. A LongAdder khi không thành công CAS (có khóa xoay bên trong), sẽ tạo một mảng các giá trị "không thành công" (giới hạn số CPU nếu tôi nhớ chính xác). Khi bạn cuối cùng yêu cầu giá trị hiện tại của nó - tất cả những giá trị "không thành công" được thêm vào kết quả. Chiến lược này chứng tỏ là khá nhanh hơn AtomicInteger.

Các vấn đề liên quan