Cómo recuperar un valor que debe calcularse en otro hilo

Hay muchos casos en los que el subproceso A requiere un valor que debe calcularse en el subproceso B. (Lo más común, B == EDT). Considere este ejemplo:

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

Por supuesto, esto no se compila, porque la clase interna anónima no puede escribir enhost. ¿Cuál es la forma más simple y limpia de hacer que esto funcione? He incluido las formas que conozco a continuación.