Hacemos una revisión completa cada reseñas de nuestro espacio con el objetivo de mostrarte en todo momento información con la mayor veracidad y actualizada.
Solución:
Es un poco extraño, pero puedes ejecutar el segundo programa sin bifurcarlo. Simplemente llamando al método principal en él. Así que olvídate de la sección de tiempo de ejecución y haz esto:
sam2.main(new String[0]);
Por supuesto, de esta manera debe compilar sam2 en tiempo de compilación
Cada proceso debe poder ejecutarse y finalizar. Puedes usar Process#waitFor
para este propósito. Del mismo modo, debe consumir cualquier salida del proceso al mismo tiempo. waitFor
bloqueará, por lo que necesitará usar un Thread
para leer la entrada (y si es necesario, escribir la salida en el proceso)
Dependiendo de la ubicación del archivo java/class, es posible que también deba especificar una carpeta de inicio desde la cual pueda comenzar la ejecución del proceso.
La mayor parte de esto es significativamente más fácil usando ProcessBuilder
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class CompileAndRun
public static void main(String[] args)
new CompileAndRun();
public CompileAndRun() InterruptedException ex)
ex.printStackTrace();
public int run(String clazz) throws IOException, InterruptedException
ProcessBuilder pb = new ProcessBuilder("java", clazz);
pb.redirectError();
pb.directory(new File("src"));
Process p = pb.start();
InputStreamConsumer consumer = new InputStreamConsumer(p.getInputStream());
consumer.start();
int result = p.waitFor();
consumer.join();
System.out.println(consumer.getOutput());
return result;
public int compile(String file) throws IOException, InterruptedException
ProcessBuilder pb = new ProcessBuilder("javac", file);
pb.redirectError();
pb.directory(new File("src"));
Process p = pb.start();
InputStreamConsumer consumer = new InputStreamConsumer(p.getInputStream());
consumer.start();
int result = p.waitFor();
consumer.join();
System.out.println(consumer.getOutput());
return result;
public class InputStreamConsumer extends Thread
private InputStream is;
private IOException exp;
private StringBuilder output;
public InputStreamConsumer(InputStream is)
this.is = is;
@Override
public void run()
int in = -1;
output = new StringBuilder(64);
try
while ((in = is.read()) != -1)
output.append((char) in);
catch (IOException ex)
ex.printStackTrace();
exp = ex;
public StringBuilder getOutput()
return output;
public IOException getException()
return exp;
Ahora, obviamente, debe verificar los resultados de retorno de los procesos, y puede producir un mejor mecanismo para interactuar con los procesos, pero esa es la idea básica …
Comentarios y calificaciones
Más adelante puedes encontrar las críticas de otros usuarios, tú incluso tienes el poder dejar el tuyo si dominas el tema.