Muss ein thread aktive mit stop beendet werden?

Status
Nicht offen für weitere Antworten.
N

n00bie

Gast
oder beendet sich der thread von selbst, wenn der code darin 1malig ausgeführt wurde?

und warum ist thread.stop() deprecated? Was ist die Ersatzmethode dafür? mein eclipse 3.3 zeigt mir die .stop() methode durchgestrichen an.
 

Marco13

Top Contributor
Die run-Methode wird EIN mal ausgeführt. Häufig ist dort aber eine "Endlosschleife" drin. Wenn man den Thread vorzeitig beenden will, muss man eine "Notbremse" in die Schleife einbauen. Das kann entweder ein boolean sein, der von außen gesetzt und dann abgefragt wird
Code:
class MyThread extends Thread 
{
    private boolean killed = false;
    public void killHim()
    {
        killed = true;
    }
    public void run()
    {
        while(true)
        {
            System.out.println("All work and no play maked jack a dull boy");

            if (killed)
            {
                break;
            }
        }
    }
}

// Stoppen:
myThread.killHim();
oder man wartet innerhalb des Threads, und fängt dann eine InterruptedException
Code:
class MyThread extends Thread 
{
    public void run()
    {
        while(true)
        {
            System.out.println("All work and no play maked jack a dull boy");

            try
            {
                Thread.sleep(10);
            }
            catch (InterruptedException e)
            {
                break;
            }
 
        }
    }
}

// Stoppen:
myThread.interrrupt();
 

André Uhres

Top Contributor
"stop" ist deprecated, weil diese Methode Objekte dadurch beschädigen kann,
daß sie in einem nicht koherenten Zustand gelassen werden.
Meistens wird "stop" durch Code ersetzt, der einfach nur eine Variable verändert, um anzuzeigen,
daß der Thread stoppen soll. Der Thread muss diese Variable regelmässig prüfen
und die run-Methode auf geordnete Art verlassen, wenn die Variable anzeigt, daß er stoppen soll.
Es wird empfohlen, diese Variable als "volatile" zu deklarieren.
Daraus folgt, daß ein Thread stirbt, sobald er die run-Methode verlässt.
 
N

n00bie

Gast
Wenn ich in einem Thread 2 oder n .exe programme aufrufe, muss dann jeder Aufruf in einen eigenen thread?
 
N

noobie

Gast
Code:
public void run()
    {
        while(true)
        {
            System.out.println("All work and no play maked jack a dull boy");

            if (killed)
            {
                break;
            }
        }
    }

danke Marco für dein gutes Beispiel! 1 Frage dazu habe ich noch:

Wenn dies:
System.out.println("All work and no play maked jack a dull boy");
der Aufruf einer .exe datei wäre und diese etwas berechnet oder ausführt. Wie kann ich das berechnen denn unterbrechen, wenn das Unterbrechen selber if(killed) erst abgefragt wird, nach dem du System.out.printl aufgerufen hast bzw. bzw. wenn die berechnung mit meinem programm beendet ist?? Das ist mir schleierhaft.
 

Marco13

Top Contributor
Mir auch :wink: Der Aufruf einer EXE-Datei ist schon ein Sonderfall. ("Sowas macht man doch nicht :noe:" :wink: )

Mit Runtime.exec erhält man ja einen Process. Und der hat eine Methode "destroy". Ob der Aufruf dieser Methode den gewünschten Effekt hat (und das kann man nicht sagen: Vielleicht hat die EXE ja inzwischen einen Reset verursacht :wink: ) kann man wohl kaum sagen, ohne es ausprobiert zu haben.
 
G

Guest

Gast
Marco13 hat gesagt.:
Mir auch :wink: Der Aufruf einer EXE-Datei ist schon ein Sonderfall. ("Sowas macht man doch nicht :noe:" :wink: )

Mit Runtime.exec erhält man ja einen Process. Und der hat eine Methode "destroy". Ob der Aufruf dieser Methode den gewünschten Effekt hat (und das kann man nicht sagen: Vielleicht hat die EXE ja inzwischen einen Reset verursacht :wink: ) kann man wohl kaum sagen, ohne es ausprobiert zu haben.

hm weiß jetzt nicht ob du mich verstanden hast. WArum darf ich aus java kein kommanozeilen programm aufrufen?

Code:
public class ZipThread extends Thread
	{
		private boolean killed = false;
	    
		public void killZip()
	    {
	        killed = true;	        
	    }
	    public void run()
	    {
	        while(!isInterrupted())
	        {
	           try{	        	    	           
		        	Process p = Runtime.getRuntime().exec("7zip.exe");
		        	if (killed)
		            {
		                p.destroy();
		            	break;
		            }
	              }
	           
	           catch(Exception e)
	           {
	        	   interrupt();
	        	   System.out.println( "Thread wurde beendet");	        	   
	           }
	        }
	    }	
	}

wenn ich von aus nun
Code:
mythread.killZip();
aufrufen würde, würde dann der process p beendet und durch das break die runmethode verlassen UND der Thread beendet?
 

Marco13

Top Contributor
Natürlich "darfst" du ein Kommandozeilenprogramm aufrufen. ("Ich bin anti-autoritär erzogen worden, ich darf ALLES :cool: " :wink: Es macht halt die Plattformunabhängigkeit kaputt - d.h. man sollte sich schon genau überlegen, was man dort macht.

Aber zur eigentlichen Frage: Du willst ja nicht den Java-Thead beenden, sondern den Prozess, den du gestartet hast. Ich habe diesen Fall selbst noch nicht gehabt, darum nur die spontane Idee, dass das mit process.destroy() ja vielleicht gehen könnte - also, ich würde es mal so versuchen, ohne Garantie, dass es klappt (bei einem kurzen Test hätte ich ein Fenster geöffnet, das nicht aufgegangen ist - aber Killen konnte man es ...)

Code:
public class ZipThread extends Thread
{
    public static void main(String args[])
    {
        ZipThread t = new ZipThread();
        t.start();
        System.out.println("Started");
        try
        {
            Thread.sleep(1000);
        }
        catch(InterruptedException e)
        {
        }

        t.killZip();

    }

    private Process process = null;

    public void killZip()
    {
        if(process != null)
        {
            process.destroy();
            System.out.println("process destroyed");
        }
    }

    public void run()
    {
        System.out.println("run");
        try
        {
	        process = Runtime.getRuntime().exec("7zip.exe");
		}
        catch(java.io.IOException e)
        {
            System.out.println("error");
        }
        try
        {
            System.out.println("waiting for process");
            process.waitFor();
        }
        catch(InterruptedException e)
        {
            System.out.println("waiting interrupted");
        }
    }
}
 
N

noobie

Gast
Code:
try
        {
            System.out.println("waiting for process");
            process.waitFor();
        }
        catch(InterruptedException e)
        {
            System.out.println("waiting interrupted");
        }

für was benutzt du die methode process.waitFor(); hier nachdem du die zip.exe aufgerufen hast?
 

Leroy42

Top Contributor
noobie hat gesagt.:
für was benutzt du die methode process.waitFor(); hier nachdem du die zip.exe aufgerufen hast?

Da Java üblicherweise nicht auf die Beendigung eines exec-Aufrufs wartet.
Ansonsten wäre die run-Methode gleich nach Aufruf von exec() beendet.
 
G

Guest

Gast
Leroy42 hat gesagt.:
noobie hat gesagt.:
für was benutzt du die methode process.waitFor(); hier nachdem du die zip.exe aufgerufen hast?

Da Java üblicherweise nicht auf die Beendigung eines exec-Aufrufs wartet.
Ansonsten wäre die run-Methode gleich nach Aufruf von exec() beendet.

Sorry, aber ich verstehe deine Antwort auf meine Frage nicht Also wird das waitfor aufgerufen, damit die 7zip.exe etwas packen kann und nicht gleich beendet wird?
 

Leroy42

Top Contributor
Nein!

Das via exec aufgerufene Programm wird unabhängig gestartet
und das Java-Programm läuft einfach weiter also wartet nicht
auf Beendigung des aufgerufenen Programms.

Wenn es doch auf Beendigung warten soll, muß man die
Methode waitFor aufrufen.
 

Marco13

Top Contributor
Die 7zip würde dann "im Hintergrund", "eigenständig" weiterlaufen, während Java mit seiner normalen Ausführung weitermacht. Wenn z.B. "count.exe" ein Programm wäre, das langsam bis 3 zählt, dann würde ein Code wie
Code:
public void run()
    {
        System.out.println("run");
        try
        {
           process = Runtime.getRuntime().exec("count.exe");
       }
       catch(java.io.IOException e){}
       System.out.println("Java hat den Aufruf gemacht, run() ist fertig!");
    }
vielleicht bwirken, dass die folgende Ausgabe erscheint:
run
1
Java hat den Aufruf gemacht, run() ist fertig!
2
3

Dagegen wäre die Ausgabe in diesem Fall
Code:
public void run()
    {
        System.out.println("run");
        try
        {
           process = Runtime.getRuntime().exec("count.exe");

           process.waitFor();
       }
       catch(Exception e){}
        
       System.out.println("Java hat den Aufruf gemacht, der prozess ist beendet, run() ist fertig!");
    }

immer (d.h. sofern der Prozess nicht mit process.destroy() unterbrochen wird)

run
1
2
3
Java hat den Aufruf gemacht, der prozess ist beendet, run() ist fertig!
 
N

n00bie

Gast
super habs kapiert, waitFor macht den process zuende und erst danach gehts im thread weiter. Danke dir.
 
N

n00bie

Gast
Aber zur eigentlichen Frage: Du willst ja nicht den Java-Thead beenden, sondern den Prozess

Ich will den Prozess im Thread beenden und den Thread selbst auch , da nach dem aufruf der 7zip.exe noch code kommt wie abfrage wie weit der Komprimierungsvorgang ist etc und stelle dies in einer JProgressBar dar...
 
N

n00bie

Gast
So sieht der Vorgang aus, wenn ich die 7zip.exe aufrufe und den process beende(7zip.exe ist im task manager entfernt)

Started
waiting for process
process destroyed

Wenn ich danach aber sofort den abgebrochenen Komprimierungsvorgang nochmals probieren möchte mit anderen einstellungen und auf den Komprimierbutton drücke, dann passiert nix(kein 7zip.exe erscheint im task manager) nur diese Ausgabe bekommme ich:

Started
waiting for process

Warum wird die 7zip.exe nicht ein 2.mal aufgerufen?

mein code:

Code:
public void actionPerformed(ActionEvent e)
{    	  
	      if(e.getSource().equals(packBT))
	      {
	           try
	           {
	             meinThread = new PackThread();
	             meinThread.start(); 
	             System.out.println("Started");	             
	             
	           }
	           catch(Exception a)
	           {
                         a.printStackTrace();
                   }
	           meinThread.killZip();
	           
	      }
	      
	      if(e.getSource().equals(stopBT))
	      {
	    	 meinThread.killZip();	    	  
	      }
}

Code:
public class PackThread extends Thread
     {
        
    	 private Process p = null; 
    	 
    	PackThread()
        {       	         	 
        }
        
        
        public void killZip()
        {
            if(p != null)
            {
               p.destroy();
                System.out.println("process destroyed");
            }
        } 
        
        public void run()
        {                     
            
            try
            {   
           	   p = Runtime.getRuntime().exec("7zip.exe");
           	           	  
            }
            catch(java.io.IOException e)
            {
                System.out.println("error");
            }
            try
            {
                System.out.println("waiting for process");
                p.waitFor();
            }
            catch(InterruptedException e)
            {
                System.out.println("waiting interrupted");
            } 
        }
     }
 
N

n00bie

Gast
gerade ist mir aufgefallen, dass die 1. 5mb datei gepackt wird aber die 2. datei bei 1 kb hängen bleibt und im task manager hat die 7zip.exe nur 0 % cpu auslastung sprich an dem 1 kb ändert sich auch nix mehr.
 
N

n00bie

Gast
hat sich geklärt mein Schuld mit dem 1kb und hängen bleiben, habe zufällig killzip() aufgerufen nach dem Process p = etc... ;P
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Warum muss ich ein SSL cert immer manuell hinzufügen? Java Basics - Anfänger-Themen 46
_so_far_away_ Inventarisierungssystem brauche switch Cases und weiß nicht, wie ich e implementieren muss Java Basics - Anfänger-Themen 5
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
berserkerdq2 Warum muss man manchmal in der RUnmethode sleep in eine schleife tun? Java Basics - Anfänger-Themen 9
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
D Bitte um Hilfe muss es schnellstmöglich erledigen Java Basics - Anfänger-Themen 15
A OOP Bidirektionale Muss-Assoziation Java Basics - Anfänger-Themen 1
Aqtox Hallo ich muss für die Schule ein Wuerfell Duell erstellen jedoch habe ich ein fehler Java Basics - Anfänger-Themen 4
M Was muss ich verändern damit ich es so ausgegeben bekomme wie auf dem Foto? Java Basics - Anfänger-Themen 2
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
R Was muss ich an meinem Code ändern? Java Basics - Anfänger-Themen 2
L Worauf muss ich achten, wenn ich externe Bibliotheken für meine Anwendungen verwende? Java Basics - Anfänger-Themen 6
L Muss eine HttpURLConnection geschlossen werden? Java Basics - Anfänger-Themen 2
B Email versenden, muss Methode static sein? Java Basics - Anfänger-Themen 7
J Muss ich die externen jars mitgeben? Java Basics - Anfänger-Themen 8
A Wie erkennt die JVM welche class verwendet werden muss? Java Basics - Anfänger-Themen 3
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
B 4 Strings, Anfangsbuchstaben muss unterschiedlich sein Java Basics - Anfänger-Themen 12
A Doppele Ketten- da muss einer rein! Java Basics - Anfänger-Themen 6
J App.jar muss im Projekt App als Bibliothek vorhanden sein?! Java Basics - Anfänger-Themen 1
S Wie muss ich die Generische Methode schreiben? Java Basics - Anfänger-Themen 6
S Warum muss ich die operationen mit AffineTransform in umgekehrter Reihenfolge ausfuehren..? Java Basics - Anfänger-Themen 4
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
X Muss man das immer so schreiben o.O Java Basics - Anfänger-Themen 3
Z Gleiches Verzeichnis für class und java unter Windows Muss? Java Basics - Anfänger-Themen 11
T Muss ein Parametertest immer eine eigene Testklasse sein? Java Basics - Anfänger-Themen 3
D Socket ---> Server Socket worauf muss ich achten? Java Basics - Anfänger-Themen 2
O Warum muss ich static? Java Basics - Anfänger-Themen 6
B Split, Exception - Obwohl es gehen MUSS Java Basics - Anfänger-Themen 3
B FileWriter close() muss? Java Basics - Anfänger-Themen 8
A Threads Eine Klasse muss auf Variable der Anderen warten. Java Basics - Anfänger-Themen 6
D Sound abspielen, wo muss die .wav liegen Java Basics - Anfänger-Themen 3
X Muss man Java können um Jython nutzen zu können? Java Basics - Anfänger-Themen 14
H Problem: Button muss zwei Mal angeklickt werden, bis Aktion ausgeführt wird Java Basics - Anfänger-Themen 4
S jcal4j/jlog4j Wo muss die Properties file rein? Java Basics - Anfänger-Themen 2
J Warum muss diese Methode static sein ?! Java Basics - Anfänger-Themen 7
D Muss ich eigentlich immer auf die Verwendung des richtigen Datentyps achten? Java Basics - Anfänger-Themen 7
S OOP Wie muss meine Klasse zu dieser main aussehen? Java Basics - Anfänger-Themen 5
D Muss ein Applet schreiben was Mittelwerte berechnet nur was mache ich falsch? Java Basics - Anfänger-Themen 11
T Warum muss diese Variable final deklariert werden? Java Basics - Anfänger-Themen 5
A Was muss ich ändern? Java Basics - Anfänger-Themen 2
E Object als Parameter das Unbekannt ist, aber ein bestimmtes Interface haben muss Java Basics - Anfänger-Themen 3
S Abstrakte Klasse, festlegen, dass Methode verändert werden muss. Java Basics - Anfänger-Themen 4
M Wann muss man eine Variable mit set-/get-Methoden in eine Bean schreiben? Java Basics - Anfänger-Themen 19
T Referenzvariablen - warum muss der Typ definiert werden? Java Basics - Anfänger-Themen 14
E Java-Programm mit Eclipse - wie muss ich anfangen. Java Basics - Anfänger-Themen 7
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
H Eine Abstrakte Klasse muss. Java Basics - Anfänger-Themen 7
G vector füllt sich immer weiter. wo muss ich ihn leeren? Java Basics - Anfänger-Themen 3
G Muss es immer extends sein ? Java Basics - Anfänger-Themen 9
F Muss ich TableCellEditor implementieren für checkbox abfrage Java Basics - Anfänger-Themen 3
P 2. Jframe öffnen und 1. Jframe muss sich dann schließen ? Java Basics - Anfänger-Themen 4
S Tabelsorter von SUN, wie muss die MysQL Anbindung realisiert Java Basics - Anfänger-Themen 11
J Rekursiv muss dass laufen! Java Basics - Anfänger-Themen 11
S Muss Programm schreiben -BRAUCHE HILFE Java Basics - Anfänger-Themen 15
C Wie muss man hier aufrufen von 2 eigenen Klassen? Java Basics - Anfänger-Themen 6
F Wie muss ich mit Preferences umgehen. Java Basics - Anfänger-Themen 5
J Ich versteh den Fehler nich, was muss ich denn ändern? Java Basics - Anfänger-Themen 3
C Klasse muss auf Event in einer anderen Klasse reagieren Java Basics - Anfänger-Themen 7
G Class.forName: Wie muss die Klasse angegeben werden? Java Basics - Anfänger-Themen 3
M muß durch muss ersetzen Java Basics - Anfänger-Themen 7
G Wie muss classpath lauten? Package kompilieren/interpretiere Java Basics - Anfänger-Themen 4
ven000m try catch - was muss bei catch rein Java Basics - Anfänger-Themen 28
D Wert muss sich pro sek ändern aber wie? HELP! Java Basics - Anfänger-Themen 9
P wohin muss ich die packages kopieren? Java Basics - Anfänger-Themen 12
G wieso muss Textfield final sein? Java Basics - Anfänger-Themen 6
Linad Warum muss man Variablen einen Wert zuweisen? Java Basics - Anfänger-Themen 5
G Warum muss das Textfeld final sein? Java Basics - Anfänger-Themen 2
G JDOM: muss XML-Datei nach Änderung abgespeichert werden? Java Basics - Anfänger-Themen 2
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben