2013-03-18 25 views
7

Tôi đã có một yêu cầu để tạo phân tích các chuỗi đang chạy trong một JVM để giám sát các công việc đang chạy dài. Có cách nào để tìm ngày/giờ bắt đầu của một chuỗi Java không? Tôi không có vấn đề nhận được các chủ đề, nhưng tôi không thể tìm ra bất kỳ cách nào để tìm ra bao lâu thread đã hoạt động hoặc khi nó bắt đầu. Để có được các chủ đề, tôi chỉ đơn giản là liệt kê trên ThreadGroup.Có cách nào để xác định thời điểm bắt đầu một chuỗi Java không?

Lưu ý rằng tôi không có quyền kiểm soát các chủ đề thực tế, vì vậy tôi không thể đặt bất kỳ thời gian hoặc tài sản nào và tự ghi lại thời gian bắt đầu. Tất cả tôi có nó là chủ đề thực tế chính nó và cần phải xác định dữ liệu từ đó. Tôi có thể tìm thấy hai phương thức trên luồng - "getThreadCpuTime()" và "getThreadUserTime()" nhưng tôi không chắc rằng chúng là đủ, vì dường như luồng này thỉnh thoảng sẽ gọi phương thức sleep() và tôi sợ rằng thời gian "ngủ" sẽ không được bao gồm trong cả hai phương pháp này.

Có cách nào để xác định thời gian bắt đầu cho chuỗi không? Hoặc một trong hai phương thức thời gian sẽ trả về một chuỗi đã hoạt động trong bao lâu?

+2

liên quan: [http://stackoverflow.com/questions/9874641/tracking-java-thread-creation-and-lifetime] (tạo chủ đề và thời gian cuộc sống) – Jayan

+0

Liên quan: [http://stackoverflow.com/questions/12491112/thread-creation-listener] (Trình nghe tạo chủ đề) –

+0

Bạn có thể sử dụng 'ThreadLocal' để lưu thời gian bắt đầu cho' Chủ đề' đó. –

Trả lời

1

Đây có phải là sự cố X-Y không?

http://www.perlmonks.org/index.pl?node_id=430320

Tôi không biết cách nào để xác định khi nào a thread bắt đầu. Nhưng tôi không chắc đó là thông tin thực sự có liên quan. Bạn đang cố gắng để hiệu suất hồ sơ? Bạn đang tìm cách sử dụng các chủ đề dài hạn làm chỉ báo hiệu suất kém?

Vấn đề với điều đó là các chuỗi được sử dụng lại mọi lúc. Tomcat gộp các luồng AJP và HTTP của nó. Khi họ nhận được yêu cầu mới, một chuỗi sẽ thoát khỏi vòng lặp của nó và thực hiện một số hành động, sau đó trở về trạng thái chờ. Bạn muốn đo lường hành động đó, không phải toàn bộ chuỗi.

Lấy ví dụ khác, chuỗi bộ thu gom rác. Điều đó sẽ luôn là một chuỗi dài chạy vì nó bắt đầu tại thời điểm khởi động JVM!

0

Nếu bạn có khả năng xác định riêng Thread lớp con của bạn, bạn có thể làm một cái gì đó như thế này:

class WugThread extends Thread 
{ 
    // constructors 

    long timeStarted = -1; 

    public void start() 
    { 
     super.start(); 
     timeStarted = System.currentTimeMillis(); 
    } 
} 
+0

Rõ ràng, nó sẽ không nhất thiết phản ánh CHÍNH XÁC khi chủ đề bắt đầu, nhưng nó không nên khác biệt nhiều hơn một vài mili giây từ khi chuỗi thực sự bắt đầu thực thi và là cách dễ nhất để theo dõi thông tin này. – Wug

+2

OP cho biết ông không thể làm điều này. – Brandon

+0

Tôi sẽ để lại câu trả lời ở đó để tham khảo những người tìm thấy câu hỏi trong tương lai. Ngắn làm một cái gì đó thực sự khó chịu liên quan đến việc thay thế việc thực hiện hệ thống của chủ đề với một trong đó hỗ trợ này, bạn có thể gặp rắc rối nào đó. getThreadCpuTime sẽ trả về tổng thời gian mà thread dùng để làm việc trên một CPU, bao gồm cả thời gian hạt nhân và getThreadUserTime sẽ trả về tổng thời gian mà thread đã sử dụng trong userland trên CPU. Bạn nói đúng, thời gian ngủ sẽ không xuất hiện ở đây. – Wug

1

Trong khi bạn có thể không có khả năng mở rộng chủ đề, bạn có thể nhìn vào sử dụng Aspect Oriented Programming để đánh chặn Runnable mới khởi động và ghi lại thời gian bắt đầu tại điểm đó.

Hãy xem AspectJ/Spring AOP

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