現在、メインスレッドとEDT(イベントディスパッチスレッド)の2つのスレッドがあります。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.interruptmySharedData
を使用して、InterruptedExecptionハンドラーをチェックインできます。