2012-07-18 35 views
11

Tôi đang tìm kiếm một cách để nhìn thấy số lượng đề hiện đang chạyLàm cách nào để kiểm tra số lượng các chuỗi đang chạy trong Java?

  1. qua Windows đầu tiên
  2. lập trình
+2

Bạn có ý nghĩa theo chương trình? – Keppil

+0

Tôi mới làm quen với đa luồng. Tôi có một chương trình java sử dụng hồ bơi thread với kích thước 10. Trong khi chương trình đang chạy, làm thế nào tôi có thể kiểm tra có bao nhiêu luồng hiện đang chạy bởi chương trình của tôi? Tôi cần một cách để làm điều này thông qua các cửa sổ và cũng thông qua chương trình chính nó bằng cách in ra số lượng các chủ đề hiện đang chạy tại thời điểm đó. –

Trả lời

26

này sẽ cung cấp cho bạn tổng số chủ đề trong máy ảo của bạn:

int nbThreads = Thread.getAllStackTraces().keySet().size(); 

Bây giờ, nếu bạn muốn tất cả chủ đề hiện đang thực hiện g, bạn có thể làm điều đó:

int nbRunning = 0; 
for (Thread t : Thread.getAllStackTraces().keySet()) { 
    if (t.getState()==Thread.State.RUNNABLE) nbRunning++; 
} 

Các trạng thái có thể được liệt kê ở đây: Thread.State javadoc

Nếu bạn muốn xem chạy đề không programmaticaly nhưng với một công cụ Windows, bạn có thể sử dụng Process Explorer.

0

Từ Windows:

Có ràng buộc để trở thành một performance counter cho quá trình có thể cho bạn biết điều đó.

lập trình:

Thread#activeCount:

Trả ước tính số lượng các chủ đề hoạt động trong nhóm chủ đề thread hiện hành và các phân nhóm của nó. Lặp lại đệ quy trên tất cả các nhóm con trong nhóm chủ đề của luồng hiện tại.

Hoặc trực tiếp hơn, ThreadGroup#activeCount:

Trả ước tính số lượng các chủ đề tích cực trong việc này thread group và phân nhóm của nó.

ThreadGroup#getParent:

Trả về mẹ của nhóm chủ đề này.

Đầu tiên, nếu cha mẹ không rỗng, phương thức checkAccess của nhóm chủ đề mẹ được gọi không có đối số; điều này có thể dẫn đến một ngoại lệ bảo mật.

Tất cả trong số đó dường như cho thấy một cái gì đó dọc theo dòng:

int activeThreadTotalEstimate() { 
    ThreadGroup group; 
    ThreadGroup parent; 

    group = Thread.currentThread().getThreadGroup(); 
    while ((parent = group.getParent()) != null) { 
     group = parent; 
    } 
    return group.activeCount(); 
} 
5

Bạn có thể nhận được tất cả các chủ đề và dấu vết ngăn xếp của họ chạy trong JVM sử dụng được Thread.getAllStackTraces()

1

Đáp lại bình luận của bạn sau

Trong đoạn mã sau: while (resultSet.next()) { name = resultSet.getString ("hName"); Nhân viên MyRunnable = new MyRunnable (hName); threadExecutor.execute (công nhân); }. Chủ đề của tôi hồ bơi có kích thước là 10.Tôi cần đảm bảo rằng chương trình của tôi hoạt động chính xác với nhiều luồng & muốn kiểm tra xem có bao nhiêu luồng là chạy ở một thời điểm nhất định. Tôi có thể làm cái này như thế nào?

để câu trả lời khác, tôi đề nghị bạn nên mã số hồ sơ của bạn với JVisualVM và kiểm tra nếu hồ bơi thread đang hoạt động như mong muốn. Lý do đằng sau gợi ý này là sau đó bạn không phải bận tâm với tất cả các chủ đề vệ sinh khác mà JVM quản lý. Bên cạnh những gì bạn muốn làm là lý do tại sao các công cụ như JVisualVM được thực hiện cho.

Nếu bạn chưa quen với việc lập hồ sơ các chương trình Java, JVisualVM cho phép bạn xem những gì diễn ra dưới mui xe trong khi bạn đang chạy mã của mình. Bạn có thể thấy hoạt động Heap, GC, kiểm tra các luồng đang chạy/chờ đợi bất kỳ mẫu/hồ sơ nào về việc sử dụng CPU hoặc bộ nhớ của bạn. Có khá nhiều plugin.

0

Đoạn mã:

import java.util.Set; 
import java.lang.Thread.State; 
public class ActiveThreads { 
    public static void main(String args[]) throws Exception{ 
     for (int i=0; i< 5; i++){ 
      Thread t = new Thread(new MyThread()); 
      t.setName("MyThread:"+i); 
      t.start(); 
     } 
     int threadCount = 0; 
     Set<Thread> threadSet = Thread.getAllStackTraces().keySet(); 
     for (Thread t : threadSet){ 
      if (t.getThreadGroup() == Thread.currentThread().getThreadGroup() && 
       t.getState() == Thread.State.RUNNABLE){ 
       System.out.println("Thread :"+t+":"+"state:"+t.getState()); 
       ++threadCount; 
      } 
     } 
     System.out.println("Thread count started by Main thread:"+threadCount); 
    } 
} 

class MyThread implements Runnable{ 
    public void run(){ 
     try{ 
      Thread.sleep(2000); 
     }catch(Exception err){ 
      err.printStackTrace(); 
     } 
    } 
} 

đầu ra:

Thread :Thread[main,5,main]:state:RUNNABLE 
Thread count started by Main thread:1 

Giải thích:

Thread.getAllStackTraces().keySet() cung cấp cho bạn danh sách tất cả Chủ đề, đã được bắt đầu bởi cả Program and System. Trong trường hợp không có điều kiện ThreadeGroup, bạn sẽ nhận được đếm chỉ số hệ thống nếu chúng đang hoạt động.

Reference Handler, Signal Dispatcher,Attach Listener and Finalizer

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