Threads Durch threads gestartete Prozesse killen

  • Themenstarter Themenstarter trez
  • Beginndatum Beginndatum
T

trez

Gast
Hallo miteinander.

Mein Problem ist, dass Threads, mehr oder weniger direkt, Prozesse starten, welche auch blokieren können. (Ach ja es handelt sich um Windows und die im echten Projekt gestarteten Programme sind nicht veränderbar)

Für das Beispiel welches das Problem aufzeigt, verwendete ich ein bat-script, welches mit ping -n 100 > NUL eine Blockade simuliert. (Es werden 100 Pings im Absstand von je einer Sekunde abgesetzt)

Der Thread verliert nach 10 Sekunden die Geduld, beendet den Prozess und terminiert.
Leider läuft der Ping-Prozess danach noch weiter. Wie werde ich den los?

Java:
public class Versuch {

    private static class MyRunnable implements Runnable {
  
        @Override
        public void run() {
            long startTime = System.currentTimeMillis();
            try {
                Process p = Runtime.getRuntime().exec("c:/tmp/test.bat");
                while (p.isAlive()) {
                    Thread.sleep(1000);
                    if ((System.currentTimeMillis() - startTime) > 10000) {
                        p.destroy();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        MyRunnable mr = new MyRunnable();
        Thread t = new Thread(mr);
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
 
Danke Joose

Das Problem ist das du eine "BAT" ausführst, diese Ausführung stoppst du auch. Dass was die BAT aber selber startet wird dadurch nicht beendet.
Das ist mir klar und genau das Kernproblem. Mir war aber bisher auch nicht klar, dass ein BS-Kommando weiter existiert, auch wenn man den aufrufenden Kontext beendet.


taskkill kannte ich nicht, aber auch damit funktioniert es nicht. Ping läuft weiter...

Java:
    while (p.isAlive()) {
        Thread.sleep(1000);
        if ((System.currentTimeMillis() - startTime) > 10000) {
            System.out.println("Kill the Process");
            ProcessBuilder killer = new ProcessBuilder("cmd.exe", "taskkill /im test.bat /f /t");
            killer.start();
            Thread.sleep(100);
            p.destroy();
            Thread.sleep(100);
        } else {
            System.out.println("Thread is running");
        }
    }

Es ist nicht sinnvoll "ping" als Prozess zu killen, denn im realen Kontext möchte ich generisch bleiben.
Gibt es noch andere Ideen?

PS: die beiden "sleep" habe ich nur auf Verdacht hin eingebaut, weil der loop den Prozess 2 mal killte ;-)
 

Zurück
Oben