It is generally better to use asyncExec(Runnable) instead of syncExec(Runnable). The work is being done asynchronously on a separate thread anyway so I see no hard requirement for this table population to be done immediately.

Please do change the code to not use Display.getDefault() (you can swap with getShell().getDisplay()) though.