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