[英]Eclipse SWT: Display.syncExec() called from a synchronized method
我有一个自定义日志,该日志获取由后台线程或由用户鼠标单击事件触发的主线程打印的数据。 这两个线程可以同时在日志上打印。 代码是这样的
public void appendLine(String s, int type) {
synchronized (this) {
int index = setInputLine(s);
if (type == BG) {
updateConsole();
}
else if (type == UI) {
printConsole();
}
}
}
方法setInputLines(),updateConsole()和printConsole()未定义为已同步。 方法updateConsole()这样从后台线程打印
public void updateConsole() {
Display.syncExec(new Runnable() {
// update widgets UI here
});
}
但是,以上代码逻辑在测试中失败。 从测试后台线程调用方法appendLine(),并且当主线程尝试通过同时调用appendLine()来获取锁时,该方法始终挂在Display.syncExec()上。 有人知道为什么吗? 谢谢
Display.syncExec
将阻塞调用它的线程,直到它可以运行为止-直到下一次UI线程在主UI循环中调用Display.readAndDispatch
,它才会阻塞。
如果主UI线程在运行appendLine
之前调用appendLine
,则UI线程将被阻塞,等待synchronized
块,然后您将readAndDispatch
死锁。
因此从这样的同步块中调用syncExec
是不安全的。
您可能可以使用asyncExec
而不是syncExec
因为这不会阻塞线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.