Прямо сейчас у вас есть два потока: основной поток и EDT (поток отправки событий).Я предполагаю, что вы знаете, что SwingUtilities.invokeLater(runnable)
выполняет задачу в EDT.
Чтобы обмениваться данными между потоками, вам просто нужна переменная, которая находится в области действия обоих потоков.Самый простой способ сделать это - объявить volatile
элемент данных или AtomicReference
в классе, содержащем метод main.
Для того, чтобы прочитал значение после itвозвращается JOptionPane
, самое простое, что вы можете здесь сделать, - это изменить вызов invokeLater на вызов invokeAndWait
.Это приведет к тому, что ваш основной поток прекратит выполнение, пока не завершится то, что вы положили в EDT.
Пример:
public class MyClass {
private static volatile String mySharedData;
public static void main(String[] args) throws InterruptedException {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
mySharedData = JOptionPane.showInputDialog(null, "Stop ?", JOptionPane.QUESTION_MESSAGE);
}
});
// main thread is blocked, waiting for the runnable to complete.
System.out.println(mySharedData);
}
}
Если ваш основной поток выполняет какую-то задачу, которая не должнаостановлен, пока присутствует панель параметров, затем в главном потоке вы можете периодически проверять (т. е. во внешней части цикла, в котором выполняется ваша задача), был ли установлен mySharedData
.Если ваша задача не зациклена и вместо этого выполняет какой-либо ввод-вывод или ожидание, вы можете использовать Thread.interrupt и проверить mySharedData
в обработчиках InterruptedExecption.