Дисплей имеет разные очереди для исполняемых файлов, которые должны запускать синхронизацию, асинхронность или в указанное время (Display.timerExec). Когда Display.readAndDispatch отправил все события, сначала выполняются исполняемые объекты в очереди синхронизации, затем очищается асинхронная очередь, и после этого выполняются соответствующие запускаемые таймеры timerExec.
Единственное различие между Display.syncExec и Display.asyncExec заключается в том, что метод syncExec ожидает выполнения runnable для потока Display. Display.asyncExec просто ставит очередь в очередь и продолжается.
Так что, если «title2» никогда не появляется, я полагаю, что ваше приложение не запускает цикл отображения:
Display display = new Display(); // this thread should be the only one that creates a display instance
while (someCondition) {
if (!display.readAndDispatch())
display.sleep();
}