Erkennen, wann Prozess beendet ist, dann Thread beenden.

Beatsleigher

Bekanntes Mitglied
Heyo Leute,

ich befasse mich derzeitig wieder mit dem Porten meines Programms Universal Android Toolkit von VB zu Java, und mir ist etwas sehr nerviges bei Java aufgefallen: Wenn man in Java einen externen Prozess starten möchte, wird dieser gar nicht beendet, selbst wenn der Prozess an sich schon längst tot ist - Java wartet einfach weiter.

Nun, mein Programm soll via ADB mit dem Android-Gerät kommunizieren, und das geht nun mal über ADB (Ich bin zu faul mir die einzelnen Ports zu merken, und dann Anweisungen via TCP zu senden).
Ich habe das Ganze schon in einem seperaten Thread laufen, damit der Benutzer weiterhin das Programm benutzen kann, jedoch, was nützt es dem Nutzer wenn er am Ende 5000 verschiedene Threads am Laufen hat, die unendlich viele Resourcen unnötig schlucken.

Java:
new Thread() {
                @Override
                public void run() {
                    try {
                        // Both jTextFields contain text.
                        ProcessBuilder process = new ProcessBuilder(adb.toString(), "push " + jTextField1.getText() + " " + jTextField2.getText());
                        Process pr = process.start();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(pr.getInputStream()));
                        String line;
                        line = reader.readLine();
                        Date now = new Date();
                        if (!line.equals("")) {
                            jTextArea1.append("[" + now.toString() + "] " + line);
                        }

                    } catch (IOException/* | InterruptedException*/ ex) {
                        JOptionPane.showMessageDialog(null, "ERROR: Error while processing your request!\n" + ex.toString(), "Error Processing Request!", JOptionPane.ERROR_MESSAGE);
                    }
                }
            }.start();

Ich möchte irgendwie erkennen, dass der Prozess beendet ist, damit ich dann mit pr.destroy(); hinterhergehen kann, und das Ding dann ein und für alle Male "still legen" kann.

Ich habe schon mit pr.wait();, pr.waitFor(); und pr.exitVale(); rumprobiert, aber dann fängt er den Output des Programms nicht mehr.

Wie kann ich das am Besten lösen, am liebsten ohne Listener, aber wenn es nicht anders geht, geht es dann nicht anders.

Vielen Dank im Voraus.

EDIT:

Da war mal eie while-Schleife drin, die ich aber rausgenommen habe.
 
Zuletzt bearbeitet:

geqoo

Bekanntes Mitglied
Du meinst, wenn die Activity destroy't wird? Dafür gibt es mit Sicherheit einen Listener, der dieses Event abfangen kann.
Und dann musst du natürlich deine Thread-Handles irgendwo speicher, z.B.

Java:
Thread t1 = new Thread() { ... };
t1.start();

Wenn der Thread-Bezeichner immer gleich heißt, dann fügst du eben t1 jedes mal bei einem neuen Thread zu einer Liste hinzu und am Ende der Anwendung gehst du dann die Liste durch und hämmerst alle Threads weg :)
 

Beatsleigher

Bekanntes Mitglied
Du meinst, wenn die Activity destroy't wird? Dafür gibt es mit Sicherheit einen Listener, der dieses Event abfangen kann.
Und dann musst du natürlich deine Thread-Handles irgendwo speicher, z.B.

Java:
Thread t1 = new Thread() { ... };
t1.start();

Wenn der Thread-Bezeichner immer gleich heißt, dann fügst du eben t1 jedes mal bei einem neuen Thread zu einer Liste hinzu und am Ende der Anwendung gehst du dann die Liste durch und hämmerst alle Threads weg :)

Verstehe ich gerade nicht kannst. Könntest du das nochmal erläutern?
 

Lonsdaleit

Aktives Mitglied
Mit der Methode join() kannst du einen Thread (der für das Löschen anderer Threads zuständig ist) warten lassen, bis der Thread xyz beendet ist. Dann wird dieser (wieder) aktiv und löscht den Thread.

Ansonsten hast du mit isInterrupted() die Möglichkeit die Aktivität eines Threads zu überprüfen.

Ich hoffe, ich habe dich richtig verstanden und konnte helfen.
 

Beatsleigher

Bekanntes Mitglied
Mit der Methode join() kannst du einen Thread (der für das Löschen anderer Threads zuständig ist) warten lassen, bis der Thread xyz beendet ist. Dann wird dieser (wieder) aktiv und löscht den Thread.

Ansonsten hast du mit isInterrupted() die Möglichkeit die Aktivität eines Threads zu überprüfen.

Ich hoffe, ich habe dich richtig verstanden und konnte helfen.

Ja, danke. Das hat mir schon ein bisschen weitergeholfen, das Hauptproblem, jedoch, ist das der Prozess den ich aufrufe, nie beendet wird. Java läuft dann immer weiter.
kennst du da vllt. noch eine Lösung für?
 

kay73

Bekanntes Mitglied
Der "Trick" ist, das Lesen von
Code:
process.getInputStream)
in einen Thread auszulagern und auf das Ende des Prozeses ganz normal mit
Code:
process.waitFor()
zu warten. Verwende einen ExecutorService anstatt Threads von Hand zu erzeugen und rufe
Code:
shutdown()
auf, damit die Anwendung normal terminiert. Das Stream-Kopieren kannst Du mit den Common-IOUtils auf einen Einzeiler reduzieren.

Java:
package test42;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ProcessTest {

	public static void main(String[] args) throws IOException,
			InterruptedException {

		final ExecutorService newCachedThreadPool = Executors
				.newCachedThreadPool();

		final Process process = new ProcessBuilder("/bin/ls", "-la").start();

		final ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);

		newCachedThreadPool.submit(new Callable<Void>() {
			@Override
			public Void call() throws IOException {
				final InputStream is = process.getInputStream();
				final byte[] buffer = new byte[1024];
				int read = -1;
				do {
					read = is.read(buffer, 0, buffer.length);
					
					if (read > 0) {
						bos.write(buffer, 0, read);
					}
				} while (read != -1);
				return null;
			}
		});
		newCachedThreadPool.shutdown();

		int waitFor = process.waitFor();

		System.out.println(String.format("Exit code: %d. Output:\n%s", waitFor,
				new String(bos.toByteArray())));
	}
}
 

Beatsleigher

Bekanntes Mitglied
Danke an alle für eure Hilfe, aber ich habe es anders geregelt bekommen.
Der Grund, warum ich die Sachen in einen Thread haben wollte, ist der, dass der Benutzer gleich danach auch andere Sachen erledigen kann, z.B. wenn er gerade eine große Datei verschiebt, dann kann er sich ja auch gleich um andere (evtl.) wichtigere Dinge kümmern.

Ich habe es (zumindest für chmod) so gemacht:

Java:
    appendLog("Chmod-ing binary (ADB)...");
        new Thread() {
            public void run() {
                try {
                    Process pr = new ProcessBuilder("/bin/chmod", "775 " + adb.toString()).start();
                    pr.waitFor();
                    appendLog("ADB has been made executable.");
                    interrupt();
                } catch (IOException | InterruptedException ex) {
                    appendLog("ERROR: Error while Chmod-ing binary (ADB)!");
                    appendLog(ex.toString());
                }
            }
        }.start();

/*
 * appendLog ist eine eigene Methode, mit der ich Text in der programm-eigenen Konsole anzeige,
 * mit Datum/Uhrzeit, etc.
*/
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Bildschirm auslesen/ Text erkennen Allgemeine Java-Themen 5
I Best Practice Kreise erkennen Allgemeine Java-Themen 1
N Erkennen eines Programs Allgemeine Java-Themen 2
P Strukturänderungen/abnormalien in Logfiles automatisch erkennen Allgemeine Java-Themen 5
A 2D-Grafik Einfachster Ansatz, um sich wiederholende Figur in einem 2D-Image zu erkennen Allgemeine Java-Themen 1
T Java Windows sounds erkennen Allgemeine Java-Themen 1
M Backslash erkennen Allgemeine Java-Themen 4
D Flasche Eingabe erkennen Allgemeine Java-Themen 4
JavaNewbie2.0 Start eines Anderen Programm erkennen Allgemeine Java-Themen 6
I Datei zugriffe erkennen Allgemeine Java-Themen 25
A Großbuchstaben erkennen (Prozente) Allgemeine Java-Themen 2
U Erkennen, ob PC benutzt wird Allgemeine Java-Themen 4
S Generellen MausKlick am PC erkennen Allgemeine Java-Themen 1
J Erkennen, ob Programm in JAR (neues Problem) Allgemeine Java-Themen 7
B Erste Schritte Plugin erkennen und Class Dateien anzeigen lassen Allgemeine Java-Themen 3
T Sechsecke, erkennen von bestimmten Werten Allgemeine Java-Themen 9
M Erkennen, in welcher Methode sich die VM befindet Allgemeine Java-Themen 6
Hoppelmann "Variable" in String erkennen Allgemeine Java-Themen 2
D IP / Domain in einem String erkennen Allgemeine Java-Themen 2
J jexcelapi - Erkennen von Sheets Allgemeine Java-Themen 3
B Mausbewegung im Thread erkennen (hoch/runter) Allgemeine Java-Themen 6
K Quadrat in einem Bild erkennen Allgemeine Java-Themen 33
D Regex Raute erkennen Allgemeine Java-Themen 2
F Groovy Erkennen geometrischer Formen in einem Kantenbild Allgemeine Java-Themen 4
K Wiederholungen in Datensatz erkennen?! Allgemeine Java-Themen 6
S Wörter ohne Leerzeichen erkennen Allgemeine Java-Themen 5
M Festplatte am Namen erkennen Allgemeine Java-Themen 2
A Erkennen welches Fenster bei windowDeactivated aktiviert wird? Allgemeine Java-Themen 2
C Reguläre Ausrücke Punkte im Satz richtig erkennen Allgemeine Java-Themen 6
J Exe Datei in Java erkennen??? Allgemeine Java-Themen 4
P Netzlaufwerke erkennen Allgemeine Java-Themen 3
H File Attribut bzw Link erkennen Allgemeine Java-Themen 5
DamienX Debug Modus zur Laufzeit erkennen Allgemeine Java-Themen 3
data89 Barcodes in Bild erkennen Allgemeine Java-Themen 17
G Wechseldatenträger erkennen Allgemeine Java-Themen 5
T Shapes vergleichen? Zeichen erkennen? Allgemeine Java-Themen 7
Daniel_L RTF - Format aus Zwischenablage erkennen und "einlesen"? Allgemeine Java-Themen 5
B Zeilenumbruch erkennen Allgemeine Java-Themen 22
H Dateiende erkennen, wie? Allgemeine Java-Themen 7
S Dateiart erkennen Allgemeine Java-Themen 13
X Position eines Gegenstandes über Webcam erkennen Allgemeine Java-Themen 11
S unter UNIX - (symbolic) links erkennen? Allgemeine Java-Themen 12
D Datum korrekt erkennen Allgemeine Java-Themen 27
G Stringformen erkennen Allgemeine Java-Themen 8
N Endlosschleifen automatisiert erkennen (Code oder Laufzeit)? Allgemeine Java-Themen 6
G Größte zusammenhängende Fläche erkennen Allgemeine Java-Themen 3
K ersten programmstart erkennen Allgemeine Java-Themen 7
S JTree selektion erkennen und drauf reagieren Allgemeine Java-Themen 2
E Regexfrage (' erkennen) Allgemeine Java-Themen 4
C WindowStyle von Windows erkennen. Allgemeine Java-Themen 3
J Erkennen aus welchem Pfad das Jar gestartet wurde Allgemeine Java-Themen 6
B Erkennen welche Objekte den Heap verbrauchen? Allgemeine Java-Themen 2
MQue JButton erkennen Allgemeine Java-Themen 2
V Erkennen ob das Programm aus Jar File geladen wurde Allgemeine Java-Themen 9
T Einfachen Ton erkennen Allgemeine Java-Themen 7
R Hinzufügen von Dateien in einem Verzeichniss Auto. erkennen! Allgemeine Java-Themen 15
L objekte erkennen? Allgemeine Java-Themen 9
M Encoding automatisch erkennen Allgemeine Java-Themen 4
J Programmteile erkennen? Allgemeine Java-Themen 4
H Exception erkennen Allgemeine Java-Themen 10
S Farbe erkennen! Allgemeine Java-Themen 3
H existierende dateien erkennen Allgemeine Java-Themen 9
Natorion Erkennen ob das Programm mittels Jar-Datei oder class . Allgemeine Java-Themen 9
A Endlosschleifen automatisch erkennen Allgemeine Java-Themen 6
G String als Zahl erkennen Allgemeine Java-Themen 19
M Exceptions - wann / wie verwenden? Allgemeine Java-Themen 4
LimDul Spezifkation, wann es deprecation Warnings gibt Allgemeine Java-Themen 1
N Streams wann .filtern? Allgemeine Java-Themen 2
perlenfischer1984 Wann ist ein Parameter Check sinnvoll Allgemeine Java-Themen 7
T GUICE- Dependency Injection- WANN nutze ich Providers? Allgemeine Java-Themen 2
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
Rudolf Wann System.exit und wann dispose? Allgemeine Java-Themen 9
L Checkstyle: Wann ist eine Methode für Vererbung entworfen? Allgemeine Java-Themen 13
X Wann ist Runtime.getRuntime().exec mit Copy fertig? Allgemeine Java-Themen 10
M Wann ist MVC sinnvoll? Allgemeine Java-Themen 14
M Wann Membermethoden, wann statische Utility-Methoden? Allgemeine Java-Themen 24
Ark Wann 64 Bit-Befehle im Einsatz? Allgemeine Java-Themen 6
G Wann normale Exception und wann Runtimeexception Allgemeine Java-Themen 12
Y Wann folgende Technologien benutzen Allgemeine Java-Themen 5
G Parameter oder Attribut (wann nehme ich was?) Allgemeine Java-Themen 12
M Wann verwendet man PropertyChangedEvents, wann eigene? Allgemeine Java-Themen 3
F Wann und wie Exceptions einsetzen? Allgemeine Java-Themen 13
G Wann statische Methoden, statische Attributen? Allgemeine Java-Themen 7
G Ab wann Datenbank verwenden Allgemeine Java-Themen 15
B Wann Interface und wann Adapter Allgemeine Java-Themen 4
B ObjectInputStream - Wann ist Ende erreicht? Allgemeine Java-Themen 10
D Wann ist das ergebnis einer Rechnung eine Double? Allgemeine Java-Themen 7
M Maximal verfügbarer Hauptspeicher? Ab wann wird ausgelagert? Allgemeine Java-Themen 13
P Wann kommt denn nun 1.5 überhaupt? Allgemeine Java-Themen 6
T Wert an laufenden Java-Prozess übergeben Allgemeine Java-Themen 10
J Warten bis cmd Prozess fertig ist Allgemeine Java-Themen 2
L Prozess automatisch beenden Allgemeine Java-Themen 8
R PIPE Kommunikation mit Prozess blockiert Allgemeine Java-Themen 0
L Java Web Start - generierter Prozess Allgemeine Java-Themen 4
Tom299 Beliebiges Windows-Programm / Prozess in den Vordergrund bringen Allgemeine Java-Themen 4
A Linux: Native Library mit Rootrechten ohne Prozess mit sudo zu starten Allgemeine Java-Themen 1
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
Thallius Neuen Prozess starten, der auch nach Beedingung des Starter-Prozesses weiterläuft? Allgemeine Java-Themen 5
D Grafisches Frontend zu einem Java Prozess erstellen Allgemeine Java-Themen 0
D neuen Prozess starten und anwendung beenden. Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben