在forEventDispatchThread的EDT之外,但从EventDispatchThread.run运行

时间:2013-10-29 18:47:04

标签: java swing event-dispatch-thread

当dumpStackTrace的第一个元素位于java.awt.EventDispatchThread.run时,为什么isEventDispatchThread()返回false?

    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            doStuff();
        }
    });

    public void doStuff(){
       Thread.dumpStack();
       System.out.print(" [addToParents] "
           + ((SwingUtilities.isEventDispatchThread() 
           ? "out of EDT" : " in EDT ")));
    }

收率:

[addToParents] out of EDT
java.lang.Exception: Stack trace
    at java.lang.Thread.dumpStack(Thread.java:1342)
    at pt.up.fe.dceg.neptus.gui.MissionBrowser.doStuff(MissionBrowser.java:899)
    at pt.up.fe.dceg.neptus.gui.MissionBrowser.access$6(MissionBrowser.java:883)
    at pt.up.fe.dceg.neptus.gui.MissionBrowser$3.run(MissionBrowser.java:1221)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:682)
    at java.awt.EventQueue$3.run(EventQueue.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

这是简化代码(不是MWS)。因为我怀疑它是一个我没有得到的概念我没有包括一个,如果需要MWS,请告诉我。

1 个答案:

答案 0 :(得分:4)

不,不是。在你的三元运算符表达式中:

(SwingUtilities.isEventDispatchThread() ? "out of EDT" : " in EDT ")))

SwingUtilities.isEventDispatchThread()正在返回true,这就是打印"Out of EDT"的原因。

表达式condition ? value1 : value2:如果condition为真,则结果为value1,否则结果为value2