7

我有这个模块在应用程序 COMM 的多个部分(在 SWT Ui 端、后端等)中使用。这个模块有一个方法 sendMessage,我想在其中添加一个例程来确定调用线程(以防在 UI 中使用它)是否是 SWT UI 线程。并警告程序员他正试图从 UI 线程进行耗时的操作......这很糟糕 :)

我当然想通过不添加对 UI 模块(来自 COMM)的任何依赖项来做到这一点。

如何确定调用线程是否是 SWT UI 线程?

谢谢,米尔恰

4

2 回答 2

10

您可以调用Display.getThread()以获取应用程序的当前 UI 线程。

如果您不想依赖 SWT UI,那么您将不得不使用反射。例如:

public static boolean isUIThread()
{
    Object uiThread = null;

    try
    {
        Class displayClass = Class.forName("org.eclipse.swt.widgets.Display");
        Method getDefaultMethod = displayClass.getDeclaredMethod("getDefault", new Class[] { });
        Object display = getDefaultMethod.invoke(null, new Object[] { });

        Method getThreadMethod = displayClass.getDeclaredMethod("getThread", new Class[] { });
        uiThread = getThreadMethod.invoke(display, new Object[] { });
    }
    catch(Exception e)
    {
        log.warn("Could not determine UI thread using reflection", e);
    }

    return (Thread.currentThread() == uiThread);
}
于 2012-08-14T13:28:19.207 回答
0

我相信这段代码将在运行时确定当前线程是否是 SWT 中的 UI 线程。它与之前添加的答案基本相同,但不使用反射。

if(Thread.currentThread() == Display.getDefault().getThread())

于 2018-12-13T12:56:38.203 回答