Wie man einen Wert abruft, der für einen anderen Thread berechnet werden muss

In vielen Fällen erfordert Thread A einen Wert, der für Thread B berechnet werden muss. (Am häufigsten ist B == EDT.) Betrachten Sie dieses Beispiel:

String host;
SwingUtilities.invokeAndWait(new Runnable() {
    public void run() {
        host = JOptionPane.showInputDialog("Enter host name: ");
    }
});
openConnection(host);

Natürlich kompiliert dies nicht, da die anonyme innere Klasse nicht in @ schreiben darhost. Was ist der einfachste und sauberste Weg, um dies zum Laufen zu bringen? Ich habe die Möglichkeiten, die ich kenne, unten aufgeführt.