现在你有两个线程在运行:主线程和 EDT(事件调度线程)。我假设您知道它SwingUtilities.invokeLater(runnable)
正在 EDT 上运行任务。
要在线程之间共享数据,您只需要两个线程范围内的一些变量。最简单的方法是声明一个volatile
数据成员或AtomicReference
在包含 main 方法的类中。
为了确保您在返回值后读取该值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
有被设置。如果您的任务没有循环,而是执行一些 I/O 或等待,您可以使用Thread.interrupt并检查mySharedData
InterruptedExecption 处理程序。