Stop a method???

rockdien

Mitglied
Angenommen, ich habe ein Class testClass mit der Funktion
public void testFkt(){
while(true){
System.out.println("Hallo");
}
}

wie kann ich diese Funktion in runtime stoppen, ohne ihre Code zu bearbeiten?

Ich habe versucht mit dem Thread aber die Methode stop() von Thread ist unsicher und funktioniert nicht.
 
Du müsstest das true in der Fortsetzungsbedingung der while-Schleife durch die Abfrage eine Flags ersetzen, welches dann von anderen Threads aus gesetzt werden kann.
 
Dicke rote Texte mit Schild davor sollte man nicht überlesen:
icon4.gif
Java™ Quelltext ist bitte in
Java:
[/B]-Tags zu schreiben:[/SIZE] [noparse][code=Java]hier Java Code einfügen
[/noparse]



Wenn du mitten in der Methode dieselbige verlassen willst, hilft oft [c]return;[/c] (ggf mit Rückgabewert). Ansonsten wie mein Vorredner schon gesagt hat: das [c]true[/c] durch eine Variable ersetzen (oder eine Methode die irgendwann false zurückgibt).

stop() hat nichts mit dem zu tun was du willst. Damit tötet man einen laufenden Thread. Da das zu brutal ist, sollte man das nicht mehr verwenden.
 
Du müsstest das true in der Fortsetzungsbedingung der while-Schleife durch die Abfrage eine Flags ersetzen, welches dann von anderen Threads aus gesetzt werden kann.

Ich habe auch versucht, aber nicht geklappt, weil die Fortsetzungsbedingung nur gecheckt wird wenn die Methode zu Ende geht.
Java:
public class ThreadClass extends Thread {
		private boolean running = true;
		
                private testClass cl;

                public ThreadClass(testClass cpncl){
			this.cl = cpncl;
		}
		
		public void run() {
			while(running) {
				cl. testFkt();
			}
		}
		
		public void shutdown() {
			running = false;
		}
}
 
Zuletzt bearbeitet:
Hi,

zeig bitte mal allen relevanten code und SETZE IHN BIIIITTTTTEEEE in java-tags!

Dankö ^^
 
Dicke rote Texte mit Schild davor sollte man nicht überlesen:
icon4.gif
Java™ Quelltext ist bitte in
Java:
[/B]-Tags zu schreiben:[/SIZE] [noparse][code=Java]hier Java Code einfügen
[/noparse]



Wenn du mitten in der Methode dieselbige verlassen willst, hilft oft [c]return;[/c] (ggf mit Rückgabewert). Ansonsten wie mein Vorredner schon gesagt hat: das [c]true[/c] durch eine Variable ersetzen (oder eine Methode die irgendwann false zurückgibt).

stop() hat nichts mit dem zu tun was du willst. Damit tötet man einen laufenden Thread. Da das zu brutal ist, sollte man das nicht mehr verwenden.


Das geht auch nicht, weil wir die Code der Funktion verändern müssen, das kann ich nicht, denn ich muss mit einer Klasse arbeiten, die zu Assembler kompiliert wurde.
 
Ich habe auch versucht, aber nicht geklappt, weil die Fortsetzungsbedingung nur gecheckt wird wenn die Methode zu Ende geht.
es muss auch ein anderer thread dies manipulieren und ausserdem wuerde ich raten zb mit AtomicBoolean den check zu machen.

aber wenn du die klasse nicht aendern darfst eruebrigt sich das ja. Aber ohne aenderung seh ich da nicht viel moeglichkeit.


deine klasse erbt von thread... reicht von aussen ein interrupt ?!
 
Ich hab die mal ein Beispiel gemacht. Ähnlich wie deins...

Java:
public class StartStopThread extends Thread{
	private boolean running = true; 

	public void run() {
		while(running) {
		    System.out.println("run...");
		}
	}

	public void shutdown() {
		running = false;
	}	
	
	public static void main(String args[]) throws InterruptedException{
		StartStopThread test = new StartStopThread();
		test.start();
		
		Thread.sleep(2000); //nach 2 Sekunden stopt der Thread... Beispielhaft
		test.shutdown();
	}
}

Es funktioniert, eventuell lag dein Fehler darin, dass du die Methode run() ausgeführt hast und nicht start();
 
Java:
while(running) {
    System.out.println("run...");
}
Sollte man lieber so schreiben, sonst hat man schnell 100% Prozessorauslastung:
Java:
while(running) {
    System.out.println("run...");
    Thread.yield();
}

[...] eventuell lag dein Fehler darin, dass du die Methode run() ausgeführt hast und nicht start();

[c]start()[/c] ist dazu da, um einen neuen Thread im System zu erstellen und in diesem [c]run()[/c] aufzurufen. Wenn man selbst [c]run()[/c] aufruft, wird das natürlich im gleichen Thread ausgeführt.
 
Ich hab das so verstanden, dass wenn ich
Code:
start()
aufrufe, der verwendete Thread die
Code:
run()
- Methode parallel ausführt.
Wenn einfach
Code:
run()
schreibe, wird die Methode ohne Verweis auf einen Thread ausgeführt (in diesem Fall Endlosschleife).
 
Ich hab die mal ein Beispiel gemacht. Ähnlich wie deins...

Java:
public class StartStopThread extends Thread{
	private boolean running = true; 

	public void run() {
		while(running) {
		    System.out.println("run...");
		}
	}

	public void shutdown() {
		running = false;
	}	
	
	public static void main(String args[]) throws InterruptedException{
		StartStopThread test = new StartStopThread();
		test.start();
		
		Thread.sleep(2000); //nach 2 Sekunden stopt der Thread... Beispielhaft
		test.shutdown();
	}
}

Es funktioniert, eventuell lag dein Fehler darin, dass du die Methode run() ausgeführt hast und nicht start();

Vielleicht hast du mich nicht verstanden. Natürlich kann man ein Thread beenden wie du geschrieben hast, aber ich brauche eine Methode einer Klasse, die mit javac kompliert wurde, zu beenden, während diese Methode noch läuft.
Konkrete: ich habe eine Klasse:
[Java]
public class classTest {
public void halloMethode(){
while(true)
{
System.out.println("Hallo!");
}
}
public static void main(String[] argv){

}
}
[/Java]

und in andere Klasse rufen wir die Methode halloMethode()

[Java]
public class Laufzeitumgebung {
public static void main(String[] argv){
classTest cl = new classTest();
cl.helloMethode();
//jetzt brauche ich diese Methode zu beenden
}

}
[/Java]
 
Okay, aber das Prinzip ist eigentlich das Selbe, wenn ich dich richtig verstanden habe.

Du hast eine Klasse von welcher aus der Thread gestartet werden kann:

Java:
public class StartStopThread extends Thread{
	private boolean running = true; 

	public void run() {
		while(running) {
		    System.out.println("Hallo");
		    Thread.yield();
		}
	}

	public void shutdown() {
		running = false;
	}	
}

Und in einer anderen Klasse kannst du deinen diesen Thread ausführen und auch wieder unterbrechen:

Java:
public class TestStartStopThread {
	public static void main(String args[]) throws InterruptedException{
		StartStopThread test = new StartStopThread();
		test.start();
		
		Thread.sleep(2000); //nach 2 Sekunden stopt der Thread... Beispielhaft
		test.shutdown();
	}
}

Ich hoffe das bringt dich weiter 🙂
 
Wenn du die andere Klasse (classTest) nicht selbst verändern kannst, und die tatsächlich so programmiert ist, dass da keine Abbruchbedingung steht - dann sieht das Ganze eher schlecht aus.
Es gibt natürlich noch die Methode Thread#stop... aber die ist mit sehr großer Vorsicht zu genießen und zu Recht deprecated (siehe Link).
 
Okay, aber das Prinzip ist eigentlich das Selbe, wenn ich dich richtig verstanden habe.

Du hast eine Klasse von welcher aus der Thread gestartet werden kann:

Java:
public class StartStopThread extends Thread{
	private boolean running = true; 

	public void run() {
		while(running) {
		    System.out.println("Hallo");
		    Thread.yield();
		}
	}

	public void shutdown() {
		running = false;
	}	
}

Und in einer anderen Klasse kannst du deinen diesen Thread ausführen und auch wieder unterbrechen:

Java:
public class TestStartStopThread {
	public static void main(String args[]) throws InterruptedException{
		StartStopThread test = new StartStopThread();
		test.start();
		
		Thread.sleep(2000); //nach 2 Sekunden stopt der Thread... Beispielhaft
		test.shutdown();
	}
}

Ich hoffe das bringt dich weiter 🙂

🙁(, danke dir, aber das ist nicht was ich will.
Zum Beispiel, jemand hat eine Klasse geschrieben, testClass.java,
[Java]
public class classTest {
public void halloMethode(){
while(true)
{
System.out.println("Hallo!");
}
}

public void byeMethode(){
System.out.println("Good bye");
}
public static void main(String[] argv){

}
}
[/Java]
danach hat er javac benutzt, um zu kompilieren, und gibt mir testClass.class (in mein Programm muss ich zuerst die Methode halloMethode() und dann byeMethode ausführen, aber die Methode ist endlos, deswegen brauche ich erste Methode beenden.

Natürlich kann man parallel ausführen, aber das ist andere Thema.

Das heiß, ich brauche eine Methode, oder Thread, oder irgendwas, was andere Methode beenden.

Ich hoffe, dass ich klar erklärt habe. 🙁
 
Wenn du die andere Klasse (classTest) nicht selbst verändern kannst, und die tatsächlich so programmiert ist, dass da keine Abbruchbedingung steht - dann sieht das Ganze eher schlecht aus.
Es gibt natürlich noch die Methode Thread#stop... aber die ist mit sehr großer Vorsicht zu genießen und zu Recht deprecated (siehe Link).

Ja, ich verstehe, die Methode stop() sollten wir nicht benutzen.
Vielleicht kann man gar nicht machen 🙁.
 
Ohne einen parallelen Thread wird die Sache schwierig.

Mal angenommen du hast folgende Klasse:

Java:
public class ClassTest{
	private boolean b = true;
	
    public void halloMethode(){
    	 while(b)
         {
             System.out.println("Hallo!");
         }
    }
    
    public void byeMethode(){
    		b = false;
    		System.out.println("Good bye");
    }
    public static void main(String[] argv){
        
    }
}

Diese wird kompiliert und in deiner Klasse eingebunden:

Java:
public class MyClass implements Runnable{
	ClassTest test;
	Thread t1 = new Thread(this);
	
	MyClass() throws InterruptedException{
		test =  new ClassTest();
		t1.start();
		Thread.sleep(500);
		test.byeMethode();
	}
	
	public static void main(String args[]) throws InterruptedException{
		new MyClass();
	}

	public void run() {
		test.halloMethode();
	}
}

Da wir ja kein Thread.stop() benutzen sollten, muss es eine Abbruchbedingung geben, die in der ersten Klasse zum Einsatz kommt.
Es führt kein Weg um einen Parallelen Prozess.
 
Zuletzt bearbeitet:
Ohne einen parallelen Thread wird die Sache schwierig.

Mal angenommen du hast folgende Klasse:

Java:
public class ClassTest{
	private boolean b = true;
	
    public void halloMethode(){
    	 while(b)
         {
             System.out.println("Hallo!");
         }
    }
    
    public void byeMethode(){
    		b = false;
    		System.out.println("Good bye");
    }
    public static void main(String[] argv){
        
    }
}

Diese wird kompiliert und in deiner Klasse eingebunden:

Java:
public class MyClass implements Runnable{
	ClassTest test;
	Thread t1 = new Thread(this);
	
	MyClass() throws InterruptedException{
		test =  new ClassTest();
		t1.start();
		Thread.sleep(500);
		test.byeMethode();
	}
	
	public static void main(String args[]) throws InterruptedException{
		new MyClass();
	}

	public void run() {
		test.halloMethode();
	}
}

Da wir ja kein Thread.stop() benutzen sollten, muss es eine Abbruchbedingung geben, die in der ersten Klasse zum Einsatz kommt.
Es führt kein Weg um einen Parallelen Prozess.

Ich verstehe deine Idee nicht. Hast du diese Program getestet? Dein Program (MyClass) läuft immer noch, vielleicht hast du gemeint, die Methode test.halloMethode() wird nach 0,5 Sekunde gestoppt dann ist test.byeMethode() dran? Aber nicht, die Methode test.byeMethode() hat kein Chance zu starten, weil test.halloMethode() noch immer weiter laufen will. 🙁.
 
Ich verstehe deine Idee nicht. Hast du diese Program getestet? Dein Program (MyClass) läuft immer noch, vielleicht hast du gemeint, die Methode test.halloMethode() wird nach 0,5 Sekunde gestoppt dann ist test.byeMethode() dran? Aber nicht, die Methode test.byeMethode() hat kein Chance zu starten, weil test.halloMethode() noch immer weiter laufen will. 🙁.

Sorry, dein Programm hat funktioniert, aber weil du code von classTest verändert hast. Angenommen, ich gebe dir nur classTest.class, das heiß, du darrt nicht den Code verändern, du kann nur reflection api benutzen, um die beide Methode aufrufen.
 
Java:
public class MyClass implements Runnable{
	ClassTest test;
	Thread t1 = new Thread(this);
	
	private boolean b = true;
	
	MyClass() throws InterruptedException{
		test =  new ClassTest();
		t1.start();
		while(true){
			test.byeMethode();
		}
	}
	
	public static void main(String args[]) throws InterruptedException{
		new MyClass();
	}

	public void run() {
		test.halloMethode();
	}
}

Du kannst die while(true) - Schleife auch weglassen, deine Methode byeMethode() wird trotzdem ausgeführt.
Nur leider geht die ausgabe "Good Bye" zwischen den ganzen "Hallo" - Ausgaben unter, deswegen hab ich das jetzt in eine Endlosschleife gepackt.
Wenn du den Thread t1 jetzt beenden willst, musst du wohl oder übel t1.stop() benutzen.
 
Java:
public class MyClass implements Runnable{
	ClassTest test;
	Thread t1 = new Thread(this);
	
	private boolean b = true;
	
	MyClass() throws InterruptedException{
		test =  new ClassTest();
		t1.start();
		while(true){
			test.byeMethode();
		}
	}
	
	public static void main(String args[]) throws InterruptedException{
		new MyClass();
	}

	public void run() {
		test.halloMethode();
	}
}

Du kannst die while(true) - Schleife auch weglassen, deine Methode byeMethode() wird trotzdem ausgeführt.
Nur leider geht die ausgabe "Good Bye" zwischen den ganzen "Hallo" - Ausgaben unter, deswegen hab ich das jetzt in eine Endlosschleife gepackt.
Wenn du den Thread t1 jetzt beenden willst, musst du wohl oder übel t1.stop() benutzen.

Das funktioniert nur weil du code von testClass verändert hast. Aber ich habe geschrieben habe, dass du code von testClass nicht verändern darfst.

Ich gebe dir jetzt testClass.class mit 2 Methode halloMethode() und byeMethode(), versuch halloMethode() zu stoppen.

classTest.class
 
Zuletzt bearbeitet:
Ich hab den Quelltext so genommen wie du ihn gepostet hast, hast du das probiert?
Ich hab das mit dem
Code:
boolean b
wieder rausgenommen
 
Ich hab den Quelltext so genommen wie du ihn gepostet hast, hast du das probiert?
Ich hab das mit dem
Code:
boolean b
wieder rausgenommen

ich habe schon probiert, und halloMethode ist immer noch gelaufen.

mein classTest war
[Java]
public class classTest {
public void halloMethode(){
while(true)
{
System.out.println("Hallo!");
}
}

public void byeMethode(){
System.out.println("Good bye");
}
public static void main(String[] argv){

}
}
[/Java]

aber dein war:
[Java]
public class ClassTest{
private boolean b = true;

public void halloMethode(){
while(b)
{
System.out.println("Hallo!");
}
}

public void byeMethode(){
b = false;
System.out.println("Good bye");
}
public static void main(String[] argv){

}
}

[/Java]

du hast b benutzt um halloMethode zu beenden, das geht aber nicht.

Ich habe probiert mit deinem Program, und das Programm ist immer noch gelaufen,
ich habe ein Photo gemacht, du kannst gucken.
Ohne Titel.png
 
wozu brauchst du ueberhaupt sowas ?

wie du an den antworten siehst ist es nicht sehr sinnig und nur ueber umwege und unlautere mittel zu schaffen (wenn ueberhaupt).
 
Deine Klasse kannst du so nehmen.

Java:
public class classTest {
    public void halloMethode(){
        while(true)
        {
            System.out.println("Hallo!");
        }
    }
 
    public void byeMethode(){
           System.out.println("Good bye");
    }
    public static void main(String[] argv){
        
    }
}

Um das deine Methode zu beenden machst du folgendes:

Java:
public class MyClass implements Runnable{
	ClassTest test;
	Thread t1 = new Thread(this);
	
	MyClass() throws InterruptedException{
		test =  new ClassTest();
		t1.start();
		Thread.sleep(100);
		t1.stop();
		test.byeMethode();
	}
	
	public static void main(String args[]) throws InterruptedException{
		new MyClass();
	}

	public void run() {
		test.halloMethode();
	}
}

Ohne Thread.stop() wirst du deine Endlosschleife nicht beenden können.
Und wie schon erwähnt ist das ziemlich unschön etwas derart zu programmieren, aber das überlasse ich dir.
Eine andere Möglichkeit wird es so nicht geben.
 
Zuletzt bearbeitet:
Deine Klasse kannst du so nehmen.

Java:
public class classTest {
    public void halloMethode(){
        while(true)
        {
            System.out.println("Hallo!");
        }
    }
 
    public void byeMethode(){
           System.out.println("Good bye");
    }
    public static void main(String[] argv){
        
    }
}

Um das deine Methode zu beenden machst du folgendes:

Java:
public class MyClass implements Runnable{
	ClassTest test;
	Thread t1 = new Thread(this);
	
	MyClass() throws InterruptedException{
		test =  new ClassTest();
		t1.start();
		Thread.sleep(100);
		t1.stop();
		test.byeMethode();
	}
	
	public static void main(String args[]) throws InterruptedException{
		new MyClass();
	}

	public void run() {
		test.halloMethode();
	}
}

Ohne Thread.stop() wirst du deine Endlosschleife nicht beenden können.
Und wie schon erwähnt ist das ziemlich unschön etwas derart zu programmieren, aber das überlasse ich dir.
Eine andere Möglichkeit wird es so nicht geben.

Vielleicht habe ich keine andere Wahl.
 
Was mir noch einfallen würde wäre den CALLER in einen Thread stecken , den UncaughtExceptionHandler setzen und von außen Thread.interrupt() aufrufen. Das sollte dann durch den call bis zum endlos-Loop laufen und das auch abbrechen.

Ist jetzt nur so ne Idee ... aber wenn du eine gegebene Klasse nicht ändern kannst/darfst ... und in dieser ein endlos-Loop OHNE Abbruchbedingung *also while(true) oder for(;😉* steht ... dann hast du echt schlechte Karten.

Mich wundert es das bisher nur einer überhaupt auf die Idee mit interrupt() gekommen ist *auch wenn diese nicht gerade so super umgesetzt wurde* ... aber ob das ganze so funktioniert das wenn man den caller interrupted auch der endlos-Loop gekillt wird ... das weis ich auch nicht.

Aber anstatt hier zu flamen das die Antworten die hier gegeben werden nicht der Aufgabenstellung entsprechen hättest du diese Zeit nutzen können und GooGLe zum Thema "java thread interrupt" zu befragen.

btw : du musst nicht alle Codes die dir gegeben werden über QUOTE doppel-posten ... das sieht 1) ziemlich stümperhaft aus und 2) bin ich mir sicher das das gegen irgendne Regel hier verstößt.
 
Ist jetzt nur so ne Idee ... aber wenn du eine gegebene Klasse nicht ändern kannst/darfst ... und in dieser ein endlos-Loop OHNE Abbruchbedingung *also while(true) oder for(;😉* steht ... dann hast du echt schlechte Karten.

Das ist nur ein Beispiel, die Idee hier ist, wenn jemand dir ein Class oder ein Component gibt (das ist nicht richtig ein Programm sondern nur Component, kann nicht selbst ausführen), das verschiedene Funktionen hat, und während du eine irgendwelche Funktion ausführst, hast du keine Lust mehr weiter zu gucken, du willst andere Funktion gucken, deswegen musst du erst mal diese beenden.

Aber anstatt hier zu flamen das die Antworten die hier gegeben werden nicht der Aufgabenstellung entsprechen hättest du diese Zeit nutzen können und GooGLe zum Thema "java thread interrupt" zu befragen.
Ich habe auch so lange an Google angefragt, aber nicht geklappt, wenn google alle Probleme lösen könnte, ist das Forum nicht mehr nötig.
 
Das ist nur ein Beispiel, die Idee hier ist, wenn jemand dir ein Class oder ein Component gibt (das ist nicht richtig ein Programm sondern nur Component, kann nicht selbst ausführen), das verschiedene Funktionen hat, und während du eine irgendwelche Funktion ausführst, hast du keine Lust mehr weiter zu gucken, du willst andere Funktion gucken, deswegen musst du erst mal diese beenden.
dann definiere ein gescheides interfaces, welches die "anderen" implementieren muessen. Teil des Interfaces ist dann die Moeglichkeit die bestehende Funktionalitaet beenden zu koennen.
 
dann definiere ein gescheides interfaces, welches die "anderen" implementieren muessen. Teil des Interfaces ist dann die Moeglichkeit die bestehende Funktionalitaet beenden zu koennen.

Wenn du zu viele Komponenten hast und jede hast viele Funktionen, brauchst du viele Interfaces, und wenn so viele noch nicht beendet werden, dann was passiert 😀.
 
Falsch, du hast viele Implementierungen. Ich denke, du bist noch recht am Anfang deines Projektes und wenn ich es richtig verstanden habe, willst du es modular halten. Dann nimm einfach gleich OSGi oder minimum den Vorschlag von Bygones.
 

Neue Themen


Zurück
Oben