Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Eclipse中实现一个既适用于UI线程又适用于其他线程的UI更新方法?_Eclipse_Multithreading - Fatal编程技术网

如何在Eclipse中实现一个既适用于UI线程又适用于其他线程的UI更新方法?

如何在Eclipse中实现一个既适用于UI线程又适用于其他线程的UI更新方法?,eclipse,multithreading,Eclipse,Multithreading,我正在实现一个更新UI的方法,该方法可以从UI线程或其他线程执行。根据Javadocs的说法,在后一种情况下,应该使用多个方法。我是否必须检查我的方法是否在UI线程中执行,或者syncExec/asyncExec是否适用于这两种情况?执行显示。从任何线程调用syncExec/asyncExec时,无论它是否为UI,都应该是安全的 有人可能怀疑从UI线程调用syncExec会导致死锁。情况并非如此,因为syncExec方法首先检查调用线程是否为UI线程。如果是这样,则立即执行Runnable的ru

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

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


有人可能怀疑从UI线程调用
syncExec
会导致死锁。情况并非如此,因为
syncExec
方法首先检查调用线程是否为UI线程。如果是这样,则立即执行
Runnable
run
方法。

执行Display.syncExec/asynceec对于任何线程(包括UI线程)都是安全的,但它并不总是最佳的路径。例如,asyncExec总是将您的runnable添加到队列中,以便稍后执行,即使您已经在UI线程上。根据您的用例,这可能是可取的,也可能不是可取的。通常,如果您知道自己已经在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.
}

我当前的用例正在向用户报告一个错误。在这种情况下,您认为什么是最好的?我想说,如果您已经在UI线程上,您希望立即出现错误。如果您还没有在UI线程上,asyncExec应该可以。