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
是一个阻塞调用,如果其他人已经在调用它。