SWT允许用户创建Display,是为了在支持多UI线程的操作系统上,创建Multi UI Thread程序。流行的操作系统中,Window支持Multi UI Thread,Linux则只允许有一个UI Thread。
实例分析(Windows)
public static void main(String[] args) { Runnable createWindowRunnable = () -> { Display display = new Display(); Shell shell = new Shell(display); shell.open(); while(!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); }; for (int i=0; i<3; ++i) { new Thread(createWindowRunnable).start();; } }
执行后会创建三个Widnow,因为在线程中创建了Display,所以它们是三个UI线程
此时三个Window互不干扰,使用display.syncExec()时,只是访问display所对应的Window。
可行性分析
上述实例,在Linux中,不能运行。会抛出此异常:Exception in thread “Thread-2” org.eclipse.swt.SWTError: Not implemented [multiple displays]。
总结
- new Display()只是SWT的一个开放接口,用于支持多UI线程的操作系统,如Windows。
- 注意,Dialog和MessageBox也是窗体,创建时,如果使用new Display(),也会产生多UI线程。
- 多UI线程并不推荐,Eclipse本身也只是单UI线程。
所以不要使用new Display(),需要时用Display.getDefault()来拿到,确保是一个单UI线程的程序。否则,程序不能跨平台,在Linux上就运行不过。