我对this代码中的代码段感到困惑:
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)
的目的是什么? 最佳答案
这是否意味着testThread和m_logTestThread是不同的实例
但指向内存中的同一对象,因此它们是相同的
线?
这是部分正确的。实际上testThread
和m_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
之前,该对象不符合垃圾收集的条件。请参阅以下链接:-Circular Reference - wiki page知道
Circular Refeference
到底是什么。“if(testThread!= null)”的目的是什么?
这很简单。您可以从这种情况推断出,它正在检查
testThread
参考是否指向null
对象。完成
null check
的目的是,您不会在NPE
内获得if-construct
,而在该位置尝试中断该引用所指向的线程。因此,如果该引用指向null
,则您没有与该引用相关联的任何线程来中断。