2013-08-01 62 views
2

在Java中,是否總是如此,如果thread1.getId() == thread2.getId(),那麼thread1.equals(thread2)如果兩個線程對象的ID相同,線程對象本身是否相等?

我試圖追蹤多線程應用程序中的錯誤,並且我注意到它使用Thread.equals()比較線程而不是比較它們的ID。 Thread類不會覆蓋其equals方法,因此兩個Thread對象的唯一方法是如果它們具有相同的內存地址。

編輯:

到目前爲止,我看到兩個原因,答案可能是否定的。

  1. thread1可能已被終止,並thread2可能被重複使用相同的ID。因此,ID是平等的,但線程不是。
  2. thread1thread2是對同一個線程的引用,但它們不是同一個對象。 (不知道這是否可能。)
+1

ID是唯一的。 – assylias

回答

4

getID

返回該線程的標識符。線程ID是創建此線程時生成的正數 長整數。線程ID爲 ,並且在其生命週期內保持不變。當一個線程被終止時,這個線程ID可能被重新使用。

這是來自Java的Thread文檔。因此,您的問題的答案是,因爲只要第一個線程被終止,另一個線程可能具有與先前線程相同的ID

+1

本文檔實際上是自相矛盾的。它可以是唯一的,也可以重複使用。我想它應該說'創建時獨一無二'? – EJP

+0

我認爲它是有道理的:P – discipliuned

0

是的。作爲主題的Javadoc說:

/** 
* Returns the identifier of this Thread. The thread ID is a positive 
* <tt>long</tt> number generated when this thread was created. 
* The thread ID is unique and remains unchanged during its lifetime. 
* When a thread is terminated, this thread ID may be reused. 
* 
* @return this thread's ID. 
* @since 1.5 
*/ 
public long getId() { 
    return tid; 
} 
+1

這就是說,ID唯一標識線程,但並不是說不可能在內存中有兩個不同的對象引用同一個線程。 – dln385

0

線程創建時,它們的標識符將按順序遞增。它們每次從0開始,對於創建它們的每個進程增加1。因此,這些ID不是全球唯一的。

+1

增量是一個實現細節。在其他Java版本......過去或未來可能會有所不同。 –

相關問題