В классе отображения SWT есть два метода, syncExec и aSyncExec. Они оба используются, когда у вас есть поток, который не является потоком пользовательского интерфейса, который хочет каким-либо образом обновить пользовательский интерфейс. По сути, когда вы звоните им, вы в основном говорите потоку пользовательского интерфейса, что у вас есть то, что вы хотите, чтобы он делал, когда у него есть шанс. Таким образом, поток пользовательского интерфейса продолжит свою текущую работу и в какой-то момент выполнит то, что вы просили. Когда это происходит, оно всегда будет меняться в зависимости от того, какую работу должен выполнять поток пользовательского интерфейса в это время.
Разница между aSyncExec и syncExec заключается в том, ожидает ли код, который его вызывает, ожидание завершения выполнения. Если вы вызываете aSyncExec, то выполнение следующего оператора в вызывающем потоке будет выполнено немедленно. Если вы вызываете syncExec, то ваш вызывающий поток будет сидеть и ждать, пока поток пользовательского интерфейса фактически выполнит код и вернется. Посредством хронометража того, сколько времени требуется для выполнения syncExec, вы тем самым определяете время не только того, сколько времени потребуется для выполнения метода run, но также и того, сколько времени прежде чем поток пользовательского интерфейса фактически начнет его запускать.
Не пытайтесь поменять syncExec с aSyncExec здесь. Если вы определите время выполнения aSyncExec, вы обнаружите, что это еще быстрее. Но это потому, что все, что вы синхронизируете, - это сколько времени требуется, чтобы сообщить потоку пользовательского интерфейса, что у вас есть что-то для этого (а не сколько времени это займет).