2009-03-31 26 views
5

Trong Java 1.4, có cách nào tốt hơn để lấy ID của Chủ đề hơn là sử dụng Thread.getName() không?Nhận mã nhận dạng duy nhất của một Chủ đề trong Java 1.4

Ý tôi là, getName() trong các bài kiểm tra đơn vị trả về một cái gì đó như "Thread-1", nhưng trong WebLogic 10 tôi nhận được "[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'.xml".

+0

Ok chúng ta cần thêm một số thông tin tại đây. Bạn có quan tâm đến tất cả các chủ đề hay chỉ những chủ đề mà bạn tạo ra (nghe như tất cả)? Bạn có cần cùng một giá trị để trả về với mỗi lần chạy thử nghiệm đơn vị hay giá trị trả về có thể khác nhau mỗi lần thử nghiệm đơn vị được chạy không? – TofuBeer

Trả lời

8

Thread.getId (về mặt lý thuyết có thể là overflow, nhưng được xác định là không thực hiện và trong thực tế sẽ không).

1.5 đang trải qua giai đoạn End of Service Life, nhưng nếu bạn đang sử dụng các boong có bụi cũ 1.4, thì bạn có thể tự mình triển khai với ThreadLocal. (Lưu ý, đừng theo tài liệu API Java SE 6 quá chặt!)

+0

Đó chỉ là việc thực hiện bởi Sun mặc dù, nó có thể được thay đổi để không chỉ đơn giản là để + + và thực sự tích cực khi tái sử dụng. Tỷ lệ cược xảy ra có thể thấp, và tỷ lệ cược của một thực hiện khác nhau, nói rằng dự án Classpath, sử dụng một phương pháp khác là mỏng. – TofuBeer

+0

Classpath (không phải là nó đã chết chưa) và Harmony có thể sử dụng một khác nhau, egregiously không tuân thủ thực hiện, nhưng trong thực tế đó chỉ là một khả năng lý thuyết. –

+0

@Tom Hawtin: Nhưng tài liệu API nêu rõ, "Khi chuỗi được chấm dứt, ID luồng này có thể được sử dụng lại." –

2

Bạn có thể sử dụng getID nếu bạn sử dụng JDK 1.5 trở lên.

Có phải trường hợp bạn cần một giá trị nhất quán cho mỗi lần bạn chạy thử nghiệm đơn vị hay chỉ là một giá trị duy nhất đủ tốt?

3

Tại sao bạn cần điều này? Bởi vì tùy thuộc vào câu trả lời của bạn, có một số cách tiếp cận.

Trước tiên, hãy hiểu rằng tên của chuỗi không được đảm bảo là duy nhất. Cũng không phải là mã băm nhận dạng.

Nếu bạn thực sự muốn kết hợp một ID duy nhất cho một chuỗi, bạn sẽ cần phải tự làm điều đó. Có thể sử dụng IdentityHashMap. Tuy nhiên, điều đó sẽ giới thiệu một tham chiếu mạnh mẽ mà bạn không muốn treo xung quanh trong một ứng dụng sản xuất.

Chỉnh sửa: TofuBeer có giải pháp có thể tốt hơn, mặc dù các tài liệu lưu ý rằng ID luồng có thể được sử dụng lại.

3

Như đã đề cập trong "Thread.getId() global uniqueness question" SO câu hỏi, và khẳng định bởi mã nguồn của Thread.java:

/* For generating thread ID */ 
private static long threadSeqNumber; 

/* Set thread ID */ 
tid = nextThreadID(); 

private static synchronized long nextThreadID() { 
    return ++threadSeqNumber; 
} 

Các thread id là rất đơn giản để thực hiện cho mình nếu bạn vẫn còn trong java1.4.
Tuy nhiên việc triển khai này có nghĩa là một chuỗi đã cho sẽ không có cùng một id khi bạn đang chạy chương trình của mình nhiều lần.
Vì vậy, tùy thuộc vào những gì bạn cần, bạn có thể phải thực hiện một chính sách đặt tên đó là cả hai:

  • duy nhất cho một phiên runtime cho
  • tái sử dụng từ phiên họp
  • vẫn liên kết với bản gốc nội bộ chính sách đặt tên được quản lý bởi 1,4 JVM ("Thread-1", "Thread-2", ...)
Các vấn đề liên quan