我对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)
的目的是什么?
答案 0 :(得分:3)
这是否意味着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
,那么您没有与该中断引用相关联的任何线程。
答案 1 :(得分:0)
这是否意味着testThread和m_logTestThread是不同的实例,但是指向内存中的同一个对象,所以它们是同一个线程?
testThread
和m_logTestThread
是指向Thread
对象的同一实例的两个引用。 (说T)
Thread testThread = m_logTestThread;
此行表示testThread
将开始指向m_logTestThread
所指向的同一对象。即两者都指向T.
m_logTestThread = null;
此行表示m_logTestThread
将开始指向null
,即它不再指向T.但是,它不会更改testThread
,而testThread
仍然是指着T。
“if(testThread!= null)”的目的是什么?
因为testThread
可能是OR null
,因此在使用testThread
之前,此条件会用于进一步计算。