Vaadin:查找当前是否在UI线程中

时间:2015-08-08 08:00:53

标签: java vaadin

在我的Vaadin应用程序中,我有一些类方法,可以从服务器中触发的事件或用户操作中调用。

我需要一种方法来确定当前代码是否在UI线程(当前正在处理来自UI的请求的线程)中执行。

有没有办法解决这个问题。我可以假设如果UI.getCurrent()返回非空引用,那么这是一个UI线程吗?

2 个答案:

答案 0 :(得分:0)

From documentation

  

获取当前使用的UI。在处理对服务器的请求时,将自动定义当前UI。在其他情况下(例如,来自后台主题),当前用户界面不会自动定义。

检查它的另一种方法是获取当前的堆栈跟踪并查看它(对于com.vaadin调用)。这里有很多例子:How can I convert a stack trace to a string?

答案 1 :(得分:0)

根据JohannesDahlströms的this post,不,你不能依赖空值:

  

嗯,是的,没有。

     

UI.getCurrent()返回的引用存储在可继承的中   ThreadLocal的。通过客户端请求或通过访问UI时   用户调用UI.access()时,UI.getCurrent()值设置为   用户界面。

     

在任意后台线程中,在UI.access()调用之外,   不存在“当前UI”的概念。那为什么,   在许多情况下,UI.getCurrent()确实返回一个非空值,即使在一个   后台线程?这是因为,如上所述,ThreadLocal是   可继承。也就是说,如果子线程是由线程生成的   那时设置了UI.getCurrent(),该值继承   孩子的线程。这很可能是你所看到的效果。它   使一些事情更方便,但我不确定   它实际上是一个好主意,它可以继承 - 它延伸了它   “当前”的含义,可能会导致用户忘记做正确的事   在访问“当前”UI之前进行同步。