如何比较线程对象

bea*_*u13 4 java concurrency multithreading

我最近遇到了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();
    }
}
Run Code Online (Sandbox Code Playgroud)

真正困扰我的是使用线程对象进行比较==.到目前为止,我一直在这样做equals(Object).我已经看过这个问题,但这两个答案并不是我想要的.

是否有可能两个不同的实例引用相同的本机线程?我应该如何比较线程对象的相等性?

Ste*_*n C 7

是否有可能两个不同的实例引用相同的本机线程?

没有.

根据Threadjavadoc:

一个线程是执行程序中的一个线程.

Thread对象的生命周期有三个阶段:

  • start()调用之前,Thread对象表示尚未创建的线程.也许永远不会被创造出来; 即如果start()没有被召唤.(此时,没有本机线程.)

  • start()调用之后,直到run()调用终止,该Thread对象表示活动线程.(此时,有一个本机线程.)

  • run()调用终止后,该Thread对象表示不再存在的线程.(此时,已删除体现该线程的本机线程.)

在任何时候,两个不同的Thread对象都没有任何意义来表示同一个线程 ; 即相同的执行线程.

我应该如何比较线程对象的相等性?

使用==是正确的方法.

equals(Object)也是正确的,因为ThreadObject它定义的地方继承它是相同的==.


在风格上.

有人会认为在风格上更好用equals.但是,在这个上下文中,Threadjavadoc(实际上)指定了equals==执行相同的操作.实际上,引用相等是唯一对Thread对象有意义的等式语义.这是从"线程生命周期"的工作方式,以及两个截然不同的执行线程的事实.(他们可以始终如一地产生相同的结果,但这是"紧急"行为......并证明行为通常是一个棘手的问题.)

另一方面,这个问题与风格无关.这是关于==在这种情况下是否在语义上正确.