这是我的代码:
Display.getCurrent().asyncExec(new Runnable() {
public void run() {
try {
Event e1 = new Event();
e1.type = EVT_CONNECTING;
for (Listener listener : listeners) {
listener.handleEvent(e1);
}
database = new Database(cp.getName(), cp.getConnection());
Event e2 = new Event();
e2.type = EVT_CONNECT_SUCCESS;
for (Listener listener : listeners) {
listener.handleEvent(e2);
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
Event e = new Event();
e.text = ex.getMessage();
e.type = EVT_CONNECT_FAILD;
for (Listener listener : listeners) {
listener.handleEvent(e);
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我尝试连接到数据库.有时这需要很长时间才能给出响应(例如网络连接超时),但是当Runnable开始运行时,用户界面会丢失响应.为什么?
你正在UI线程上运行这个数据库连接Runnable - 这意味着你正在饿死UI线程处理任何其他会导致它绘制的消息,响应点击事件等等.所以是的,当你运行时此数据库连接作业,您的UI将无法执行任何其他操作,UI将无法响应.
您可能不希望在UI线程上运行此数据库连接作业,您可能希望在简单的后台线程中执行此操作,然后Display#asyncExec在数据库连接作业完成后使用结果将结果发布回UI线程.
您可以使用Eclipse Jobs API.
创建一个扩展的类,org.eclipse.core.runtime.jobs.Job在run方法中粘贴数据库代码,然后调用job.schedule()计划并运行作业.
请看看Lars Vogel的网站,以获得更多示例.