Eclipse SWT:从同步方法调用 Display.syncExec()
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 线程在主线程中调用 Display.readAndDispatch
UI循环。
如果主 UI 线程在 readAndDispatch
为 运行 之前调用 appendLine
,则 UI 线程将被阻塞等待 synchronized
块然后你有死锁。
所以像这样从同步块中调用 syncExec
是不安全的。
您可以使用 asyncExec
而不是 syncExec
,因为这不会阻塞线程。
我有一个自定义日志,它获取由后台线程或由用户鼠标单击事件触发的主线程打印的数据。这两个线程可能会同时打印日志。代码是这样的
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 线程在主线程中调用 Display.readAndDispatch
UI循环。
如果主 UI 线程在 readAndDispatch
为 运行 之前调用 appendLine
,则 UI 线程将被阻塞等待 synchronized
块然后你有死锁。
所以像这样从同步块中调用 syncExec
是不安全的。
您可以使用 asyncExec
而不是 syncExec
,因为这不会阻塞线程。