2009-12-17 21 views

Trả lời

38

công cụ hữu ích để gỡ lỗi chương trình java, nó mang lại cho số lượng chủ đề và các thông tin khác có liên quan trên chúng:

jconsole <process-id>

+0

Các phương pháp khác cũng tốt, nhưng điều này hữu ích hơn. – ndemir

15

Có một phương pháp tĩnh trên Thread Lớp rằng sẽ trả lại số đề hoạt động kiểm soát bởi JVM:

Thread.activeCount()

Trả về số đề hoạt động trong nhóm chủ đề các thread hiện hành.

Ngoài ra, trình gỡ rối bên ngoài sẽ liệt kê tất cả các chuỗi đang hoạt động (và cho phép bạn tạm ngưng bất kỳ chuỗi nào) nếu bạn muốn theo dõi chúng trong thời gian thực.

2
public class MainClass { 

     public static void main(String args[]) { 

      Thread t = Thread.currentThread(); 
      t.setName("My Thread"); 

      t.setPriority(1); 

      System.out.println("current thread: " + t); 

      int active = Thread.activeCount(); 
      System.out.println("currently active threads: " + active); 
      Thread all[] = new Thread[active]; 
      Thread.enumerate(all); 

      for (int i = 0; i < active; i++) { 
      System.out.println(i + ": " + all[i]); 
      } 
     } 
    } 
54

ManagementFactory.getThreadMXBean().getThreadCount() không giới hạn bản thân để các nhóm chủ đề là Thread.activeCount().

+0

+1 Đối với điều này. Số lượng chủ đề là chính xác cùng một tôi nhìn thấy trên 'top'. Mặc dù trên cửa sổ gỡ lỗi, tôi chỉ thấy 2 luồng chạy thay vì 5.:/ – Aruman

+0

ManagementFactory? theo gói nào? – Meher

+1

@ 421 văn bản được liên kết với Javadocs ... – gustafc

3

Tôi đã viết một chương trình để lặp tất cả Threads tạo và in getState() của mỗi Thread

import java.util.Set; 

public class ThreadStatus { 
    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()){ 
       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(); 
     } 
    } 
} 

Output:

java ThreadStatus 

Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING 
Thread :Thread[main,5,main]:state:RUNNABLE 
Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING 
Thread :Thread[MyThread:4,5,main]:state:TIMED_WAITING 
Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING 
Thread :Thread[MyThread:3,5,main]:state:TIMED_WAITING 
Thread count started by Main thread:6 

Nếu bạn loại bỏ dưới điều kiện

if (t.getThreadGroup() == Thread.currentThread().getThreadGroup()) 

Bạn sẽ nhận được các chủ đề dưới đây trong đầu ra quá, whi ch đã được bắt đầu bởi hệ thống.

Reference Handler, Signal Dispatcher,Attach Listener and Finalizer.

2

Giải pháp chung không yêu cầu GUI như jconsole (không hoạt động trên các thiết bị đầu cuối từ xa), ps hoạt động đối với các quy trình không phải java, không yêu cầu cài đặt JVM.

ps -o nlwp <pid>

2

Sử dụng lệnh Linux Lên trên

top -H -p (process id)

bạn có thể nhận quá trình id của một chương trình bằng phương pháp này:

ps aux | grep (your program name)

ví dụ:

ps aux | grep user.py

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