final Thread bgThread = new Thread(new LongRunningOperation(display) { @Ovveride public void executeOperation(final IProgressMonitor monitor) { //Long running operation final Object[] result = fetchData(); if (display != null && !display.isDisposed()) { display.syncExec(new Runnable() { @Override public void run() { refreshUI(); monitor.done(); deactivateUICallBack(CALLBACK_ID); } }); } } }); bgThread.setDaemon(true); bgThread.start(); public abstract class LongRunningOperation implements IRunnableWithProgress, Runnable { private final Display display; public LongRunningOperation(Display aDisplay) { this.display = aDisplay; } public abstract void executeOperation(IProgressMonitor monitor); public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask("Bitte warten. Daten werden vorbereitet...", IProgressMonitor.UNKNOWN); executeOperation(monitor); throw new InterruptedException(); } @Override public void run() { final LongRunningOperation thisRunnbale = this; display.syncExec(new Runnable() { @Override public void run() { ProgressMonitorDialog dialog = new ProgressMonitorDialog(display.getActiveShell()); try { dialog.run(true, false, thisRunnbale); } catch (InvocationTargetException e) { MyLogger.getLogger().fatal("", e); } catch (InterruptedException e) { //nothing to do } } }); } }