这是我的代码:
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);
}
}
}
});
在上面的代码中,我尝试连接到数据库。有时这需要很长时间才能给出响应(例如网络连接超时),但是当Runnable
开始运行时,用户界面会丢失响应。为什么呢?
答案 0 :(得分:5)
你正在UI线程上运行这个数据库连接Runnable - 这意味着你正在饿死UI线程处理任何其他可能导致它绘制的消息,响应点击事件等等。所以是的,当你在重新运行此数据库连接作业时,您的UI将无法执行任何其他操作,并且UI将无法响应。
您可能不想要在UI线程上运行此数据库连接作业,您可能希望在简单的后台线程中执行此操作,然后将结果发布回UI线程数据库连接作业完成后使用Display#asyncExec
。
答案 1 :(得分:5)
您可以使用Eclipse Jobs API。
创建一个扩展org.eclipse.core.runtime.jobs.Job
的类,将数据库代码放在run
方法中,然后调用job.schedule()
来安排和运行作业。
请查看Lars Vogel's site以获取更多示例。
答案 2 :(得分:1)
asyncExec
的目的是安排在UI线程中运行的东西(并在调度后立即返回),因此不能并行运行任何东西。