Ich kam vor kurzem in den Quellen von AWTs EventQueue
, wo ich dieses Stück Code sah:Wie Thread vergleichen Objekte
final boolean isDispatchThreadImpl() {
EventQueue eq = this;
pushPopLock.lock();
try {
EventQueue next = eq.nextQueue;
while (next != null) {
eq = next;
next = eq.nextQueue;
}
if (eq.fwDispatcher != null) {
return eq.fwDispatcher.isDispatchThread();
}
return (Thread.currentThread() == eq.dispatchThread);
} finally {
pushPopLock.unlock();
}
}
Was ringt mir wirklich, dass die Thread-Objekte verglichen werden ==
verwenden. Bisher habe ich das mit equals(Object)
gemacht. Ich habe mich schon this question angesehen, aber die zwei Antworten sind nicht wirklich das, wonach ich suche.
Ist es möglich, dass sich zwei verschiedene Instanzen auf denselben nativen Thread beziehen? Wie sollte ich Thread-Objekte für die Gleichheit vergleichen?
Heh, einer jener amüsanten Situationen, in denen die * Frage * ist in der Tat ein Duplikat, aber die Antworten dort nicht beantwortet die gestellte Frage. :-) –
Der Schlüssel zu Ihrer Frage ist, ob 'Thread.currentThread() == eq.dispatchThread' Ihnen jemals ein anderes Ergebnis geben wird als' Thread.currentThread(). Equals (eq.dispatchThread) '.Und die Antwort ist nein, wird es nie, denn ['Thread.currentThread'] (http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#currentThread--) wird gib niemals 'null' zurück und' Thread' erbt 'gleich' von 'Objekt' und [' Objekt # ist gleich '] (http://docs.oracle.com/javase/8/docs/api/java/lang/Object .html # equals-java.lang.Object-) tut '=='. –
@ T.J.Crowder Ich dachte das Gleiche! ;) – beatngu13