通过new Display()创建多UI 线程

By | 5月 29, 2019

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线程

image

此时三个Window互不干扰,使用display.syncExec()时,只是访问display所对应的Window。

可行性分析

上述实例,在Linux中,不能运行。会抛出此异常:Exception in thread “Thread-2” org.eclipse.swt.SWTError: Not implemented [multiple displays]。

总结

  1. new Display()只是SWT的一个开放接口,用于支持多UI线程的操作系统,如Windows。
  2. 注意,Dialog和MessageBox也是窗体,创建时,如果使用new Display(),也会产生多UI线程。
  3. 多UI线程并不推荐,Eclipse本身也只是单UI线程。

所以不要使用new Display(),需要时用Display.getDefault()来拿到,确保是一个单UI线程的程序。否则,程序不能跨平台,在Linux上就运行不过。