Java Eclipse SWT:Display.syncExec()从同步方法调用
我有一个自定义日志,它获取后台线程或由用户鼠标单击事件触发的主线程打印的数据。两个线程可以同时在日志上打印。代码是这样的Java Eclipse SWT:Display.syncExec()从同步方法调用,java,multithreading,swt,Java,Multithreading,Swt,我有一个自定义日志,它获取后台线程或由用户鼠标单击事件触发的主线程打印的数据。两个线程可以同时在日志上打印。代码是这样的 public void appendLine(String s, int type) { synchronized (this) { int index = setInputLine(s); if (type == BG) { updateConsole(); } else if
public void appendLine(String s, int type) {
synchronized (this) {
int index = setInputLine(s);
if (type == BG) {
updateConsole();
}
else if (type == UI) {
printConsole();
}
}
}
public void updateConsole() {
Display.syncExec(new Runnable() {
// update widgets UI here
});
}
方法setInputLines()、updateConsole()和printConsole()未定义为已同步。方法updateConsole()从后台线程打印,如下所示
public void appendLine(String s, int type) {
synchronized (this) {
int index = setInputLine(s);
if (type == BG) {
updateConsole();
}
else if (type == UI) {
printConsole();
}
}
}
public void updateConsole() {
Display.syncExec(new Runnable() {
// update widgets UI here
});
}
但是,上述代码逻辑在测试中失败。方法appendLine()是从测试后台线程调用的,当主线程试图通过并发调用appendLine()获取锁时,它总是在Display.syncExec()处挂起。有人知道为什么吗?谢谢显示。syncExec将阻止调用它的线程,直到它可以运行为止-直到下次UI线程在主UI循环中调用显示。读取和分派 如果主UI线程在运行
readAndDispatch
之前调用appendLine
,UI线程将被阻塞,等待synchronized
阻塞,然后出现死锁
因此,像这样从同步块中调用syncExec
是不安全的
您可能可以使用
asynceec
而不是syncExec
,因为这不会阻塞线程。您是说syncExec
中的代码正在调用appendLine
?appendLine()正在调用updateConsole()。updateConsole()调用Display.syncExec()。问题是,如果后台线程正在调用appendLine(),则主线程不能同时调用appendLine()。否则程序将挂起。syncExec
是一个阻塞调用,如果其他人已经在调用它。