В случае 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.