4

我对此代码的片段感到困惑:

void stopTestThread() {

    // thread should cooperatively shutdown on the next iteration, because field is now null
    Thread testThread = m_logTestThread;
    m_logTestThread = null;
    if (testThread != null) {
      testThread.interrupt();
      try {testThread.join();} catch (InterruptedException e) {}
    }
  }

这是否意味着 testThread 和 m_logTestThread 是不同的实例,但指向内存中的同一个对象,所以它们是同一个线程?

如果有,目的是if (testThread != null)什么?

4

2 回答 2

3

这是否意味着 testThread 和 m_logTestThread 是不同的实例,但指向内存中的同一个对象,所以它们是同一个线程?

这是部分正确的。其实testThreadm_logTestThread是两个不同的references不是instances。并且两个引用都指向同一个Thread对象。因此,仅仅reference m_logTestThread指出指向null并不意味着testThread引用也指向null

您还可以通过一个简单的示例在实践中看到它:-

String str = "abc";
String strCopy = str;  // strCopy now points to "abc"
str = null;  // Nullify the `str` reference

System.out.println(strCopy.length()); // Will print 3, as strCopy still points to "abc"

因此,即使您将其中一个引用设置为 null,另一个引用仍然指向同一个 Thread 对象。一个对象在0 reference指向它或存在circular reference.

请参阅此链接: -循环参考 - wiki 页面以了解究竟是什么Circular Refeference

“如果(testThread!= null)”的目的是什么?

这很简单。您可以从条件推断,它正在检查testThread引用是否指向一个null对象。这样null check做是为了,您不会NPEif-construct其中尝试中断该引用指向的线程。因此,如果该引用指向null,那么您没有与该引用关联的任何线程来中断。

于 2012-11-15T06:38:06.750 回答
0

这是否意味着 testThread 和 m_logTestThread 是不同的实例,但指向内存中的同一个对象,所以它们是同一个线程?

testThread并且 m_logTestThread是指向同一Thread对象实例的两个引用。(说T)

Thread testThread = m_logTestThread;

这条线意味着testThread将开始指向指向的相同对象m_logTestThread。即两者都指向T。

m_logTestThread = null;

这条线表示m_logTestThread将开始指向null,即不再指向 T。但是,它没有改变testThreadtestThread仍然指向 T。

“如果(testThread!= null)”的目的是什么?

因为testThread可能 OR 可能不是null,因此在使用之前使用此条件进行进一步计算testThread

于 2012-11-15T06:40:08.590 回答