# wait - Process



## dasago (15. Februar 2007)

Hallo Leute,

ich starte in meinem Programm ein Prozess. Dieser wird anschließend ausgeführt. Nun möchte ich aber, dass das Programm solang wartet, bis der Prozess ausgeführt. Wie funktioniert dies?

Mein Code:


```
ProcessBuilder builder = new ProcessBuilder
	    ("cmd", "/c", "start", "sqlplus"); 
	    Process curProcess = builder.start();
	    try{
	    	curProcess.waitFor();
	    	System.out.println("Warten..?");
	    }
	    catch(Exception ex){
	    ex.printStackTrace();}
```

Aso.. und falls jemand nebenher meine 2. Frage no weiss is au gut: 

Wie bekomm ich die CMD-Box wieder weg, wenn ich meine Befehle ausgeführt hab?


----------



## Thomas Darimont (15. Februar 2007)

Hallo,

Schau mal hier:

```
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 * 
 */
public class ProcessExecutionExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "start",
                "/WAIT", "sqlplus", "tom/tutorials@192.168.163.128:1521/XE");
        Process curProcess = builder.start();
        try {
            curProcess.waitFor();
            System.out.println("Warten..?");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
```

Gruß Tom


----------



## dasago (15. Februar 2007)

Hey danke für die Antwort.. 

ich hab nun des "/WAIT"eingefügt und es funktioniert - endlich  
Nun hab ich nur noch des Problem mit dem schließen der CMD-Box. Diese soll sich automatisch schließen wenn mein SQL Befehl ausgeführt wurde. Zur Zeit muss ich es ja per Hand machen und wenn ich es nicht schließ dann läuft nun des Programm nicht mehr weiter


----------



## Thomas Darimont (15. Februar 2007)

Hallo,

na dann schau mal hier:

```
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.io.FileWriter;
import java.io.InputStream;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author Tom
 * 
 */
public class ProcessExecutionExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        File sqlStatementFile = new File("c:/init.sql");
        if (!sqlStatementFile.exists()) {
            FileWriter fileWriter = new FileWriter(sqlStatementFile);
            fileWriter.write("SELECT 'BUBU' FROM DUAL;\nEXIT\n");
            fileWriter.close();
        }

        ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "sqlplus",
                "tom/tutorials@192.168.163.128:1521/XE", "@" + sqlStatementFile);
        Process process = builder.start();
        createInputFetcherFor(process.getInputStream());

        try {
            process.waitFor();
            System.out.println("Warten..?");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private static void createInputFetcherFor(final InputStream inputStream) {
        final ExecutorService executorService = Executors
                .newSingleThreadExecutor();
        executorService.execute(new Runnable() {
            public void run() {
                Scanner scanner = new Scanner(inputStream);
                while (scanner.hasNextLine()) {
                    System.out.println(scanner.nextLine());
                }
                scanner.close();
                executorService.shutdown();
            }
        });
    }
}
```

Ausgabe:

```
SQL*Plus: Release 10.1.0.2.0 - Production on Do Feb 15 15:24:51 2007

Copyright (c) 1982, 2004, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production


'BUB
----
BUBU

Disconnected from Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
Warten..?
```

Gruß Tom


----------



## dasago (16. Februar 2007)

Nach deinem Beispiel zu urteilen muss somit ein EXIT in meiner SQL-Datei stehen? Seh ich das richtig? Wenn ja gibt es auch noch eine andere Möglichkeit?


----------

