java - 如何比较线程对象

标签 java multithreading concurrency

我最近发现了 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)。他们同样正确。 ThreadObject 继承 equals,它被定义为与 == 相同。


论风格。

有些人会争辩说使用 equals 在文体上更好。我对此没有任何强烈的意见。

但是,这个问题与风格无关。它(本质上)是关于 == 在此上下文中是否在语义上正确。确实如此。

关于java - 如何比较线程对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39972629/

相关文章:

java - case-statement 或 if-statement 效率视角

java - 插入带有自动递增字段的行

java - mongodb (java) 包括按名称排列的 id 字段

swift - Realm 1.0 如何使用线程

java - Lmax Disruptor,许多消费者 - 如何让消费者只接受特定类型的消息并独立进行?

Java Swing - UI block

java - HTTP 状态 400 - 客户端发送的请求在语法上不正确。 Spring MVC

c - 同步所有事件线程C并一一释放?

python - 如何使用python启动两个线程?

ios - Swift 4 中的核心数据并发问题