在我的Vaadin应用程序中,我有一些类方法,可以从服务器中触发的事件或用户操作中调用。
我需要一种方法来确定当前代码是否在UI线程(当前正在处理来自UI的请求的线程)中执行。
有没有办法解决这个问题。我可以假设如果UI.getCurrent()
返回非空引用,那么这是一个UI线程吗?
答案 0 :(得分:0)
是
获取当前使用的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之前进行同步。