2013-05-23 34 views
5

Tại sao, ví dụ: Thread.currentThread().getId() trả về dài?Loại trả về getId() trên đối tượng chuỗi

Điều này thực sự cần phải là 64 bit? Giống như tôi sẽ có một máy chạy số lượng chủ đề đó!

Nghiêm túc, đó là một chút đau vì tôi đang viết một thứ gì đó theo dõi các số nhận dạng chuỗi cùng với các bit khác và tôi thực sự không phải sử dụng số lượng dài như vậy, để tạo ra là rất lớn.

Có thể có một quy ước về lợi tức dài; như 48 bit đầu tiên luôn bằng không. Tôi đã tìm hiểu về internet nhưng không tìm thấy gì cả. Tôi cũng mong là như vậy; Có ai biết chắc chắn?

Cảm ơn.

+0

số getId() có thể sẽ trở lại một số định danh của hệ điều hành cơ bản, vì vậy bạn có chính xác không đảm bảo về giá trị. –

+0

Có vẻ như là một ý tưởng tốt để lên kế hoạch cho tương lai và cho phép một số lượng lớn các chủ đề. – Keppil

+0

Vì đó là cách họ thiết kế nó. Bạn đã bỏ qua trường hợp nó thực sự trả về một con trỏ * 64 bit *. Không xây dựng. – EJP

Trả lời

6

Mã này:

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

nên cung cấp cái nhìn sâu sắc là tại sao. Về cơ bản, các id luồng được gán bởi một bộ đếm đang chạy, vì vậy nếu bạn không chấm dứt JVM của mình trong một khoảng thời gian đáng kể, con số này sẽ vượt quá thời gian dài. Tôi chỉ có thể tưởng tượng rằng họ đã làm điều đó để giảm cơ hội va chạm trong các chuỗi dài chạy.

+0

Cảm ơn lời giải thích này +1 và chấp nhận sau vài phút. Tôi có một mình ở đây trong suy nghĩ đó là một chút thô tục? – Bathsheba

+0

@Bathsheba câu trả lời của tôi là thô tục? – Woot4Moo

+0

Không, nó hoàn hảo. Khái niệm về việc tạo ra một con số quá lớn đến mức chúng ta không phải lo lắng về lỗi đó là thô tục, imo. – Bathsheba

1

Các ứng dụng Java được đóng hộp cát liên quan đến các ứng dụng Java khác, đó là cách mà ID của chuỗi có khả năng xung đột.

Chủ đề không có nghĩa là duy nhất trên tất cả ứng dụng, chúng chỉ là duy nhất cho mỗi ứng dụng. Nhìn vào Thread.init phương pháp trong nguồn, bạn có thể tìm thấy:

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

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

Tôi đoán nó được sử dụng để ngăn chặn một lỗi tràn bộ tiềm năng. Khi chuỗi được tạo, số cuối cùng sẽ tràn. Dài chỉ đang được

9223372036854775807(Max long value) - 2147483647(Max int value) = 9.223372e+18 

an toàn hơn một chút :)

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