找出调用线程是否是SWT UI线程 - 确定调用线程

时间:2012-08-14 11:58:39

标签: java swt

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

我想通过不在UI模块上添加任何依赖项来实现这一目的(来自COMM)。

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

谢谢, 米尔恰

2 个答案:

答案 0 :(得分:9)

您可以调用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);
}

答案 1 :(得分:0)

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

  

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