Swing から JTextComponent を装飾するクラスがあります。含まれているメソッドはどのスレッドからでも呼び出すことができるため、JTextComponent で動作するコードが AWT スレッドによって実行されるようにする必要があります。
2 番目の要件は、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 "";
}
}
}
コードはうまく機能していますが、まだ 1 つの問題があります。私のクラスを使用したい人が AWT スレッドの名前を変更すると、デッドロックに陥ります。
AWT スレッドを明確に識別し、この問題を回避する方法はありますか?
ありがとうございました