在invokeLater()或invokeAndWait的情况下给出关系之前发生了吗?

时间:2014-01-15 20:11:36

标签: java swing event-dispatch-thread invokelater happens-before

很确定就是这样 - 但我想肯定地知道 - 在invokeLater()或invokeAndWait()的情况下给出关系之前发生了吗?

方法在(SwingUtilities分别)AWT.EventQueue中定义。 我想在EventQueue中输入内容时会涉及同步 因此,作为同步的结果,发生在之前的关系,最后给出了可见性。

但是真的那样吗? (我在哪里可以找到这些信息?)


e.g。 在一些工作线程中

    ...
    *<1> heavy computation modifying lots of DATA*
    ...
    SwingUtilities.invokeLater(
        new Runnable() {
            @Override
            public void run() {
                *<2> is visibility of modified DATA guaranteed?*
            }
        }
    );

e.g。 在一些线程内

    ...
    SwingUtilities.invokeAndWait(
        new Runnable() {
            @Override
            public void run() {
                ...
                *<1> change some DATA*
            }
        }
    );
    *<2> is visibility of modified DATA guaranteed?*

1 个答案:

答案 0 :(得分:1)

简而言之:是的,在调用invokeLater / invokeAndWait的线程的动作与由此提交的runnable的EDT上的操作之间存在发生之前的关系。没有它,整个API的理智将受到威胁。

不幸的是,任何确认这一点的权威来源都很难找到。关于Swing和并发的很多东西都会发生这种情况。

有关更多信息,请参阅 trashgod this answer,这是一位长期的Swing大师。