今天遇到个问题,Eclipse在Splash启动阶段对多线程的支持有点不同。根据某人的见解,org.eclipse.ui.internal.StartupThreading 可以解决这个问题
我看了一眼Eclipse自己的Splash实现是这样的:
private void updateUI(final Runnable r) { Shell splashShell = getSplash(); if (splashShell == null || splashShell.isDisposed()) return; Display display = splashShell.getDisplay(); if (Thread.currentThread() == display.getThread()) r.run(); // run immediatley if we're on the UI thread else { // wrapper with a StartupRunnable to ensure that it will run before // the UI is fully initialized StartupRunnable startupRunnable = new StartupRunnable() { public void runWithException() throws Throwable { r.run(); } }; display.asyncExec(startupRunnable); } }
Eclipse建议的状态监控,是用IProgressMonitor来解决,使用方式是重写
org.eclipse.ui.splash.AbstractSplashHandler.getBundleProgressMonitor()这个方法。
然后提供一个IProgressMonitor,参考org.eclipse.jface.wizard.ProgressMonitorPart。