¿Cómo inicio un proceso completamente independiente desde un programa Java?

Estoy trabajando en un programa escrito en Java que,para algunas acciones, inicia programas externos utilizando líneas de comando configuradas por el usuario. Actualmente usaRuntime.exec() y no retiene elProcess reference (los programas iniciados son un editor de texto o una utilidad de archivo, por lo que no es necesario que el sistema ingrese / salga / err streams).

in embargo, hay un pequeño problema con esto, ya que cuando el programa Java se cierra, realmente no se cierra hasta que se cierran todos los programas iniciados.

Preferiría mucho que los programas lanzados fueran completamente independientes de la JVM que los lanzó.

El sistema operativo de destino es múltiple, con Windows, Linux y Mac como mínimo, pero cualquier sistema GUI con una JVM es realmente lo que se desea (de ahí la configurabilidad del usuario de las líneas de comando reales).

Alguien sabe cómo hacer que el programa lanzado se ejecute de manera completamente independiente de la JVM?

Edit en respuesta a un comentario

El código de lanzamiento es el siguiente. El código puede iniciar un editor ubicado en una línea y columna específicas, o puede iniciar un visor de archivos. Los valores entre comillas en la línea de comando configurada se tratan como codificados con ECMA-262, se decodifican y se quitan las comillas para formar el parámetro de ejecución deseado.

El lanzamiento se produce en el EDT.

static Throwable launch(String cmd, File fil, int lin, int col) throws Throwable {
    String frs[][]={
        { "$FILE$"  ,fil.getAbsolutePath().replace('\\','/') },
        { "$LINE$"  ,(lin>0 ? Integer.toString(lin) : "") },
        { "$COLUMN$",(col>0 ? Integer.toString(col) : "") },
        };
    String[] arr; // array of parsed tokens (exec(cmd) does not handle quoted values)

    cmd=TextUtil.replace(cmd,frs,true,"$","$");
    arr=(String[])ArrayUtil.removeNulls(TextUtil.stringComponents(cmd,' ',-1,true,true,true));
    for(int xa=0; xa<arr.length; xa++) {
        if(TextUtil.isQuoted(arr[xa],true)) {
            arr[xa]=TextDecode.ecma262(TextUtil.stripQuotes(arr[xa]));
            }
        }
    log.println("Launching: "+cmd);
    Runtime.getRuntime().exec(arr);
    return null;
    }

Esto parece estar sucediendo solo cuando el programa se inicia desde mi IDE. Estoy cerrando esta pregunta ya que el problema existe solo en mi entorno de desarrollo; @ no es un problema en producción. Del programa de prueba en una de las respuestas, y las pruebas adicionales que he realizado, estoy convencido de que no es un problema que cualquier usuario del programa verá en ninguna plataforma.

Respuestas a la pregunta(14)

Su respuesta a la pregunta