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

use*_*797 5 java swing invokelater event-dispatch-thread happens-before

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

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

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


例如在一些工作线程内

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

例如在一些线程内

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

Mar*_*nik 5

简而言之:是的,调用/的线程的操作与由此提交的可运行对象的 EDT 上的操作之间存在发生前关系。如果没有这个,整个 API 的健全性就会受到威胁。invokeLaterinvokeAndWait

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

有关更多信息,请参阅trashgod(一位长期 Swing 大师)的回答。