2013-08-01 99 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版本......过去或未来可能会有所不同。 –

相关问题