Это происходит, когда вы пытаетесь воздействовать на элемент интерфейса из потока, который не является потоком пользовательского интерфейса.
Чтобы запустить код в потоке пользовательского интерфейса, вы должны использовать Runnable и попросить поток отображения запуститьЭто.Таким образом:
Display.getDefault().syncExec( new Runnable() {
@Override
public void run() {
// Do your job here
}
} );
Как указано в методе syncExec javadoc,
поток, вызывающий этот метод, приостанавливается до завершения работоспособного.
Также вы можете проверитьметод asyncExec.