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,因为这不会阻塞线程。