В случае invokeLater() или invokeAndWait задано отношение "происходит до"?

Я уверен, что это так, но я хотел бы знать наверняка, есть ли отношение "происходит до" в случае 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?*
            }
        }
    );

например, внутри какой-то нити

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

1 ответ

Решение

Короче говоря: да, между действиями потока, вызывающими поток, наложено отношение " происходит раньше" invokeLater/invokeAndWait и представленные таким образом действия в отношении EDT работающего объекта. Без этого разумность всего API была бы под угрозой.

К сожалению, трудно получить какой-либо авторитетный источник, который подтвердил бы это. Это происходит со многими вещами, касающимися Swing и параллелизма.

Для получения дополнительной информации обратитесь к этому ответу от trashgod, давнего гуру Swing.

Другие вопросы по тегам