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