Задается ли отношение «происходит до» в случае 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?*

person user3199797    schedule 15.01.2014    source источник
comment
Я действительно не понимаю, что вы пытаетесь спросить.   -  person jzd    schedule 16.01.2014
comment
В первом примере в каком-то потоке в позиции ‹1› данные изменяются, после чего вызывается invokeLater(). Видны ли измененные данные в позиции ‹2› внутри исполняемого файла.   -  person user3199797    schedule 16.01.2014
comment
invokeAndWait должен быть вызван из EDT, проверенный isEventDispatchThread должен возвращать false, в противном случае несколько исключений могут заморозить графический интерфейс Swing, может навсегда зависеть от   -  person mKorbel    schedule 16.01.2014
comment
В первом примере в каком-то потоке в позиции ‹1› данные изменяются, а затем вызывается invokeLater(). Видны ли измененные данные в позиции ‹2› внутри исполняемого файла. Во втором примере снова в позиции ‹1› данные изменяются, а позже (вне исполняемого объекта), когда функция invokeAndWait() завершилась, доступ к ним осуществляется в позиции ‹2›. Видны ли измененные данные снова?   -  person user3199797    schedule 16.01.2014
comment
Спасибо mKorbel за ответ. Глядя на JAVA - параллелизм на практике от Brain Goetz, вам вообще нужна синхронизация, чтобы гарантировать отношение «происходит до», и в результате вы получаете видимость данных. Я не могу найти никакой информации, которая гарантирует, что invokeLater() происходит до или видимость данных.   -  person user3199797    schedule 16.01.2014


Ответы (1)


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

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

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

person Marko Topolnik    schedule 15.01.2014
comment
@MarkoTopolnik: Спасибо! Думаю, я должен принять это. Поскольку AWT EventQueue гарантирует порядок FIFO, когда задачи/Runnable помещаются в EventQueue с помощью invokeLater(), должна быть синхронизация. В результате этого можно считать, что «вызов invokeLater()» происходит — до «старта задачи» и дается видимость (в этом направлении). Задача видит по крайней мере значения на момент вызова invokeLater(). В любом случае, я бы предпочел не думать о внутренних реализациях, а иметь авторитетный источник (например, API), гарантирующий мне это. - person user3199797; 16.01.2014
comment
Я думаю, что такое поведение не обязательно должно быть задокументировано. См. stackoverflow.com/q/64497416/3882565. - person stonar96; 01.11.2020