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).我已经看过这个问题,但这两个答案并不是我想要的.
是否有可能两个不同的实例引用相同的本机线程?我应该如何比较线程对象的相等性?
是否有可能两个不同的实例引用相同的本机线程?
没有.
根据Threadjavadoc:
一个线程是执行程序中的一个线程.
Thread对象的生命周期有三个阶段:
在start()调用之前,Thread对象表示尚未创建的线程.也许永远不会被创造出来; 即如果start()没有被召唤.(此时,没有本机线程.)
在start()调用之后,直到run()调用终止,该Thread对象表示活动线程.(此时,有一个本机线程.)
在run()调用终止后,该Thread对象表示不再存在的线程.(此时,已删除体现该线程的本机线程.)
在任何时候,两个不同的Thread对象都没有任何意义来表示同一个线程 ; 即相同的执行线程.
我应该如何比较线程对象的相等性?
使用==是正确的方法.
但equals(Object)也是正确的,因为Thread从Object它定义的地方继承它是相同的==.
在风格上.
有人会认为在风格上更好用equals.但是,在这个上下文中,Threadjavadoc(实际上)指定了equals并==执行相同的操作.实际上,引用相等是唯一对Thread对象有意义的等式语义.这是从"线程生命周期"的工作方式,以及两个截然不同的执行线程的事实.(他们可以始终如一地产生相同的结果,但这是"紧急"行为......并证明行为通常是一个棘手的问题.)
另一方面,这个问题与风格无关.这是关于==在这种情况下是否在语义上正确.