我有一个类,用来装饰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线程并避免此问题?
谢谢
发布于 2014-02-20 20:20:33
与其测试名称,不如检查线程是否为事件调度线程。
if (EventQueue.isDispatchThread()) {
// do stuff...
}注意,即使您使用的是AWT,您也可以调用
if (SwingUtilities.isEventDispatchThread()) {
// do stuff...
}得到完全一样的东西。
发布于 2014-02-20 20:19:06
你在找SwingUtilities.isEventDispatchThread()
另外,应该调用SwingUtilities.invokeAndWait(),而不是一直循环直到任务完成。
https://stackoverflow.com/questions/21918463
复制相似问题