首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标识AWT线程

标识AWT线程
EN

Stack Overflow用户
提问于 2014-02-20 20:11:03
回答 2查看 102关注 0票数 0

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

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

代码语言:javascript
复制
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线程并避免此问题?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-20 20:20:33

与其测试名称,不如检查线程是否为事件调度线程

代码语言:javascript
复制
if (EventQueue.isDispatchThread()) {
    // do stuff...
}

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

代码语言:javascript
复制
if (SwingUtilities.isEventDispatchThread()) {
    // do stuff...
}

得到完全一样的东西。

票数 3
EN

Stack Overflow用户

发布于 2014-02-20 20:19:06

你在找SwingUtilities.isEventDispatchThread()

另外,应该调用SwingUtilities.invokeAndWait(),而不是一直循环直到任务完成。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21918463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档