Nochmal: den Timeout brauchst du nur falls das aufgerufene Programm nur dasitzt und nichts tut (also auch keine Exception wirft).
Das ist so ja nicht ganz richtig. Das Kernproblem ist ja, dass ich stdout des externen Programmes sowie auch stderr lesen will. Dabei gibt es zwei Fälle:
1. Externes Programm gibt etwas auf stdout aus, das kann ich lesen. Danach versuche ich, vom stderr zu lesen, was blockiert und readline() kehrt nicht zurück.
2. Externes Programm wirft eine Exception. Ich versuche, vom stdout zu lesen, was nicht klappt. readline() blockiert und es geht nicht weiter.
Auf jeden Fall brauche ich entweder beim stdout-lesen oder stderr-lesen einen Timeout.
Ich frage mich wozu dieser ganze Aufwand gut sein soll. Wenn du eine Subroutine aufrufst bereitest du dich doch auch nicht darauf vor, das diese in eine Endlosschleife geraten könnte und du die Ausführung dann stoppen mußt...
Der Vergleich hinkt etwas - von einer externen Resource etwas über einen Stream zu lesen ist ja ne ganz andere Nummer, als eine Subroutine aufzurufen, die unter meiner vollen Kontrolle steht. Von der Unzuverlässigkeit einer Streaming-Kommunikation sollte man ausgehen, und das versuche ich hier ja gerade.
Ich denke man kann das ganze lösen, indem man entweder non-blocking-IO verwendet (NIO), oder eben das Lesen jeweils in 2 Threads macht - nach einem Timeout schließt man dann die Streams, was hoffentlich auch das readline() abbricht. Alternativ könnte man auch die Methode BufferedReader.ready() wiederholt aufrufen ("pollen"), und wenn das Ding nach z.B. 10 Versuchen nicht "ready" ist, bricht man die ganze Sache ab.