如何实现一个UI更新方法,该方法适用于Eclipse线程和Eclipse中的其他线程?

时间:2012-02-28 15:13:48

标签: eclipse multithreading

我正在实现一个更新UI的方法,可以从UI线程或其他线程执行。根据Javadocs的说法,在后一种情况下,应该使用Display.syncExec()Display.asyncExec()方法。我是否必须检查我的方法是否在UI线程中执行,或者syncExec / asyncExec是否适用于这两种情况?

2 个答案:

答案 0 :(得分:1)

从任何线程调用时执行Display.syncExec/asyncExec应该是安全的,无论它是否是UI。

有人可能会怀疑从UI线程调用syncExec会导致死锁。事实并非如此,因为syncExec方法首先检查调用线程是否是UI线程。如果是这样,run的{​​{1}}方法会立即执行。

答案 1 :(得分:1)

执行Display.syncExec / asyncExec对任何线程(包括UI线程)都是安全的,但它并不总是最好的路径。例如,即使您已经在UI线程上,asyncExec也会始终将您的runnable添加到队列中以便稍后执行。根据您的使用情况,可能需要也可能不需要。通常,如果您知道自己已经在UI线程上,那么最好继续执行工作项。

我喜欢在任何需要更新UI的方法中使用以下代码段,并且可以从非UI线程调用。如果从UI线程调用,它会立即执行工作。如果从其他线程调用,它使用asyncExec在下一批中安排工作而不阻塞调用线程。

public void task()
{
    if( this.display.getThread() != Thread.currentThread() )
    {
        this.display.asyncExec
        (
            new Runnable()
            {
                public void run()
                {
                    task();
                }
            }
        );

        return;
    }

    // Do whatever needs to be done with the UI.
}