识别AWT线程

时间:2014-02-20 20:11:04

标签: java multithreading swing invokelater futuretask

我有一个类,它从Swing中装饰JTextComponent。它包含的方法可以从任何线程调用,因此我必须确保,与JTextComponent一起使用的代码将由AWT线程执行。

第二个要求是,调用整个方法的线程将“等待”直到AWT线程完成任务。

public String getSelectedText() {
        Callable c = new Callable() {
            @Override
            public Object call() throws Exception {
                if (area.getSelectedText() == null) {
                    return "";
                }
                return area.getSelectedText();
            }
        };

        if (Thread.currentThread().getName().contains("AWT")) {
            return (String)c.call();
        }
        else {
            FutureTask task = new FutureTask(c);

            SwingUtilities.invokeLater(task);

            while (!task.isDone()) {
                //waiting
            }
            try {
                return (String)task.get();
            }
            catch (InterruptedException | ExecutionException ex) {
                return "";
            }
        }
    }

代码对我来说效果很好,但仍有一个问题。如果有人想要使用我的类,重命名AWT线程,那么它就会陷入僵局。

有没有办法明确地识别AWT线程并避免这个问题?

谢谢

2 个答案:

答案 0 :(得分:3)

您正在寻找SwingUtilities.isEventDispatchThread()

此外,在完成任务之前,不应主动循环,而应调用SwingUtilities.invokeAndWait()

答案 1 :(得分:3)

不应测试名称,而应检查线程是否为event dispatch thread

if (EventQueue.isDispatchThread()) {
    // do stuff...
}

请注意,即使您使用的是AWT,也可以调用

if (SwingUtilities.isEventDispatchThread()) {
    // do stuff...
}

并得到完全一样的东西。