我最近发现了 AWT 的源代码 EventQueue
我在哪里看到这段代码:
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();
}
}
真正让我感到困扰的是线程对象是使用==
进行比较的。到目前为止,我一直在用 equals(Object)
来做这件事。我已经看过 this question但这两个答案并不是我真正想要的。
是否有可能两个不同的实例引用同一个 native 线程?我应该如何比较线程对象的相等性?
最佳答案
Is it possible that two different instances refer to the same native thread?
没有。
根据 Thread
javadoc:
A thread is a thread of execution in a program.
Thread
对象的生命周期分为三个阶段:
在
start()
调用之前,Thread
对象表示尚未创建的 thread。并且可能永远不会被创造;即如果start()
没有被调用。 (此时,没有 native 线程。)在
start()
调用之后,直到run()
调用终止,Thread
对象表示一个 Activity 的 < em>线程。 (此时,有一个 native 线程。)run()
调用终止后,Thread
对象表示一个不再存在的线程。 (此时体现线程的 native 线程已被删除。)
两个不同的 Thread
对象表示同一个 thread 在任何时候都没有任何意义;即相同的执行线程。
How should I compare thread objects for equality?
您可以使用 ==
或 equals(Object)
。他们同样正确。 Thread
从 Object
继承 equals
,它被定义为与 ==
相同。
论风格。
有些人会争辩说使用 equals
在文体上更好。我对此没有任何强烈的意见。
但是,这个问题与风格无关。它(本质上)是关于 ==
在此上下文中是否在语义上正确。确实如此。
关于java - 如何比较线程对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39972629/