Если вам действительно нужна какая-то сверхобобщенная функция «вызовите как можно скорее», полезен такой помощник:
void invokeAsSoonAsPossible(Runnable action) {
if (SwingUtilities.isEventDispatchThread())
action.run();
else SwingUtilities.invokeLater(action);
}
// Usage:
invokeAsSoonAsPossible(new Runnable(){
@Override
public void run() {
jTable.getModel().setValueAt(...
}
});
Но мой опыт подсказывает, что это гораздо лучшая стратегия для структурирования и документирования вашего кода, чтобы было легче отслеживать, что и где выполняется. Если у вас есть открытый метод в классе, который должен быть запущен в EDT, JavaDoc - хороший друг:
/**
* Blah blah blah, describe the method's purpose.
* <p>
* <strong>Note:</strong> This method should always be
* invoked on the Swing event dispatch thread.
*/
public Pony calulateValue() {
// go ahead and touch the components any way you please
}
Вы также можете добавить утверждение в методах только для EDT как вид исполняемой документации:
assert SwingUtilities.isEventDispatchThread();
Короче говоря: если вам трудно отслеживать, в каком потоке вы находитесь, ваш код, вероятно, настолько груб, что вам трудно отследить что-либо, и вам следует беспокоиться о рефакторинге кода, а не о том, какой Вы в теме.