Hallo,
ich habe folgendes Problem. Ich benutze zwei Threads. Einer (Thread batch) ist für den Process des DOS-Fenster zuständig, in dem eine Batch-Datei gestartet wird. Der andere Thread ist dafür zuständig, den Thread batch zu kontrollieren. Er führt den Thread batch aus bzw. startet ihn und beendet ihn später auch wieder!
Im Moment lässt sich der Prozess des Thread batch nicht beenden. Ich habe als Beispiel eine Endlosschleife geschrieben, welche beendet werden soll. Aber mit der Methode interrupt() funktioniert dieses nicht.
Aber ich zeig jetzt erstmal die Quelldatei. Der Inhalt sollte ausreichend auskommentiert sein:
Jetzt habe ich es so probiert, indem ich einen boolean erzeuge und ihm am Anfang des Thread batch den Wert true gebe. Am Ende des Thread (codes) bekommt er dann den Wert false übergeben. Der andere Thread soll jetzt in die If-Abfrage (ZEILE 75) gehen, wenn der boolean threadStatus == false ist um dann die Anweisung auszuführen. Also batch.interrupt(). Jedoch sagt mir jetzt der Compiler, dass in der Bedingung das threadStatus ... The field Thread.threadStatus is not visibile. Ich kann mir das nicht erklären was damit gemeint ist.
Eine andere Frage wäre noch, wie ich den Process der Batch-Datei (die Endlosschleife) anders beenden kann. Dabei sollten aber keine Funktionen und Methoden aus robot oder KeyEvent vorkommen.
Mein Ziel ist nämlich, die Endlosschleife nach xx Sekunden durch den Thread wieder zu beenden. Also kontrolliert den Prozess beenden. Die Krönung wäre natürlich, dass sich das DOS-Fenster dann mitschließt.
Schon mal vielen Dank im Vorraus!
Grüße
Dexta
PS: Wer es selber testen möchte. Anleitung für die Batch-Datei:
bat Datei erzeugen...
:START
echo off
echo "Hallo!"
sleep1
GOTO START
.. abspeichern und starten. Nicht dabei dann vergessen, String pfad + datei richtig umzubennen :wink:
ich habe folgendes Problem. Ich benutze zwei Threads. Einer (Thread batch) ist für den Process des DOS-Fenster zuständig, in dem eine Batch-Datei gestartet wird. Der andere Thread ist dafür zuständig, den Thread batch zu kontrollieren. Er führt den Thread batch aus bzw. startet ihn und beendet ihn später auch wieder!
Im Moment lässt sich der Prozess des Thread batch nicht beenden. Ich habe als Beispiel eine Endlosschleife geschrieben, welche beendet werden soll. Aber mit der Methode interrupt() funktioniert dieses nicht.
Aber ich zeig jetzt erstmal die Quelldatei. Der Inhalt sollte ausreichend auskommentiert sein:
Code:
import java.io.BufferedInputStream;
import java.io.IOException;
public class ThreadInterruptDemoApp {
public static void main(String[] args) {
// Thread batch wird erstellt
final Thread batch = new Thread() {
// Variable des Typen Boolean wird erstellt zum festlegen des Thread-Status
final boolean threadStatus = false;
public void run() {
try {
// threadStatus wird auf true gesetzt
threadStatus = true;
// int mode = 1;
// Variablen des Typen String zum ausführen der Batch-Datei werden erzeugt
String command = "cmd /c start ";
String pfad = "D:\\";
String datei = "execbatchdemo_endlos.bat";
// Runtime und Process werden initialisiert
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command+pfad+datei);
// BufferedInputStream wird erstellt zum lesen des InputStreams des Prozsses pr
BufferedInputStream bis = new BufferedInputStream(pr.getInputStream());
// Hilfs-Variable integer ci
int ci = 0;
// Überprüfung welchen Status der InputStream hat
// bei -1 ist der Prozess zu Ende, bei 0 ist der Prozess noch am laufen
while (ci != -1)
ci = bis.read();
// Warte auf das Ende des Threads batch
pr.waitFor();
// threadStatus auf false setzen
threadStatus = false;
}
catch (IOException ioe) {
System.out.println("Fehler beim ausführen der Datei! " + ioe);
}
catch (InterruptedException ie) {
ie.printStackTrace();
}
}
};
// Zweiter Thread wird erzeugt zum starten und beenden des Thread batch
new Thread() {
public void run() {
try {
// Thread batch wird gestartet
batch.start();
// Konsolenausgabe zur Überprüfung ob der Thread batch aktiv ist
System.out.println(batch.isAlive());
// Programmablauf wird für 5 Sekunden angehalten
System.out.println("Programmablauf pausiert 5 Sekunden ... bitte warten!");
sleep(5000);
// If-Abfrage mit Verwendung des Boolean threadStatus
if (batch.threadStatus == false)
System.out.println("interrupt!!");
// Mit interrupt() sollte der Thread batch beendet werden
batch.interrupt();
System.out.println("Batch-Thread beendet: " + batch.isInterrupted());
// Konsolenausgabe zur Überprüfung ob der Thread batch noch aktiv ist
System.out.println(batch.isAlive());
}
catch (InterruptedException ie) { }
}
}.start();
}
}
Jetzt habe ich es so probiert, indem ich einen boolean erzeuge und ihm am Anfang des Thread batch den Wert true gebe. Am Ende des Thread (codes) bekommt er dann den Wert false übergeben. Der andere Thread soll jetzt in die If-Abfrage (ZEILE 75) gehen, wenn der boolean threadStatus == false ist um dann die Anweisung auszuführen. Also batch.interrupt(). Jedoch sagt mir jetzt der Compiler, dass in der Bedingung das threadStatus ... The field Thread.threadStatus is not visibile. Ich kann mir das nicht erklären was damit gemeint ist.
Eine andere Frage wäre noch, wie ich den Process der Batch-Datei (die Endlosschleife) anders beenden kann. Dabei sollten aber keine Funktionen und Methoden aus robot oder KeyEvent vorkommen.
Mein Ziel ist nämlich, die Endlosschleife nach xx Sekunden durch den Thread wieder zu beenden. Also kontrolliert den Prozess beenden. Die Krönung wäre natürlich, dass sich das DOS-Fenster dann mitschließt.
Schon mal vielen Dank im Vorraus!
Grüße
Dexta
PS: Wer es selber testen möchte. Anleitung für die Batch-Datei:
bat Datei erzeugen...
:START
echo off
echo "Hallo!"
sleep1
GOTO START
.. abspeichern und starten. Nicht dabei dann vergessen, String pfad + datei richtig umzubennen :wink: