# Stop a method???



## rockdien (4. Nov 2011)

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.


----------



## Murray (4. Nov 2011)

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.


----------



## Tomate_Salat (4. Nov 2011)

Dicke rote Texte mit Schild davor sollte man nicht überlesen:




Java™ Quelltext ist bitte in *


		Java:In die Zwischenablage kopieren


[/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.*


----------



## rockdien (4. Nov 2011)

Murray hat gesagt.:


> 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.

```
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;
		}
}
```


----------



## noobadix (4. Nov 2011)

Hi,

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

Dankö ^^


----------



## rockdien (4. Nov 2011)

Tomate_Salat hat gesagt.:


> Dicke rote Texte mit Schild davor sollte man nicht überlesen:
> 
> 
> 
> ...


*

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.*


----------



## rockdien (4. Nov 2011)

noobadix hat gesagt.:


> Hi,
> 
> zeig bitte mal allen relevanten code und SETZE IHN BIIIITTTTTEEEE in java-tags!
> 
> Dankö ^^



Ich bin noch nicht fertig mit dem Projekt.


----------



## bygones (5. Nov 2011)

rockdien hat gesagt.:


> 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 ?!


----------



## Sotsch (5. Nov 2011)

Ich hab die mal ein Beispiel gemacht. Ähnlich wie deins...


```
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();


----------



## faetzminator (5. Nov 2011)

Sotsch hat gesagt.:


> ```
> while(running) {
> System.out.println("run...");
> }
> ```


Sollte man lieber so schreiben, sonst hat man schnell 100% Prozessorauslastung:

```
while(running) {
    System.out.println("run...");
    Thread.yield();
}
```



Sotsch hat gesagt.:


> [...] 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.


----------



## Sotsch (5. Nov 2011)

Ich hab das so verstanden, dass wenn ich 
	
	
	
	





```
start()
```
 aufrufe, der verwendete Thread die 
	
	
	
	





```
run()
```
 - Methode parallel ausführt.
Wenn einfach 
	
	
	
	





```
run()
```
 schreibe, wird die Methode ohne Verweis auf einen Thread ausgeführt (in diesem Fall Endlosschleife).


----------



## faetzminator (5. Nov 2011)

Genau, denn da wird [c]shutdown()[/c] nie erreicht


----------



## rockdien (5. Nov 2011)

Sotsch hat gesagt.:


> Ich hab die mal ein Beispiel gemacht. Ähnlich wie deins...
> 
> 
> ```
> ...



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]


----------



## Sotsch (5. Nov 2011)

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:


```
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:


```
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


----------



## Illuvatar (5. Nov 2011)

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).


----------



## rockdien (5. Nov 2011)

Sotsch hat gesagt.:


> 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:
> 
> ...



(, 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.


----------



## rockdien (5. Nov 2011)

Illuvatar hat gesagt.:


> 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 .


----------



## Sotsch (5. Nov 2011)

Ohne einen parallelen Thread wird die Sache schwierig.

Mal angenommen du hast folgende Klasse:


```
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:


```
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.


----------



## rockdien (5. Nov 2011)

Sotsch hat gesagt.:


> Ohne einen parallelen Thread wird die Sache schwierig.
> 
> Mal angenommen du hast folgende Klasse:
> 
> ...



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. .


----------



## rockdien (5. Nov 2011)

rockdien hat gesagt.:


> 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.


----------



## Sotsch (5. Nov 2011)

```
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.


----------



## rockdien (5. Nov 2011)

Sotsch hat gesagt.:


> ```
> public class MyClass implements Runnable{
> ClassTest test;
> Thread t1 = new Thread(this);
> ...



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


----------



## Sotsch (5. Nov 2011)

Ich hab den Quelltext so genommen wie du ihn gepostet hast, hast du das probiert?
Ich hab das mit dem 
	
	
	
	





```
boolean b
```
 wieder rausgenommen


----------



## rockdien (5. Nov 2011)

Sotsch hat gesagt.:


> Ich hab den Quelltext so genommen wie du ihn gepostet hast, hast du das probiert?
> Ich hab das mit dem
> 
> 
> ...



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


----------



## bygones (5. Nov 2011)

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).


----------



## Sotsch (6. Nov 2011)

Deine Klasse kannst du so nehmen.


```
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:


```
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.


----------



## rockdien (6. Nov 2011)

Sotsch hat gesagt.:


> Deine Klasse kannst du so nehmen.
> 
> 
> ```
> ...



Vielleicht habe ich keine andere Wahl.


----------



## rockdien (6. Nov 2011)

bygones hat gesagt.:


> 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).



Ich muss eine Laufzeitumgebung für Komponenten schreiben.


----------



## bygones (6. Nov 2011)

rockdien hat gesagt.:


> Ich muss eine Laufzeitumgebung für Komponenten schreiben.


ok das sagt erstmal nicht viel aus bzw keine ahnung was du damit meinst, nur dass ich wette, dass dein ansatz von dauerlaufenden threads der voellig falsche ansatz ist.


----------



## irgendjemand (6. Nov 2011)

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.


----------



## rockdien (6. Nov 2011)

irgendjemand hat gesagt.:


> 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. 



irgendjemand hat gesagt.:


> 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.


----------



## bygones (6. Nov 2011)

rockdien hat gesagt.:


> 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.


----------



## rockdien (6. Nov 2011)

bygones hat gesagt.:


> 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 .


----------



## Tomate_Salat (6. Nov 2011)

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.


----------



## rockdien (7. Nov 2011)

Tomate_Salat hat gesagt.:


> 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.



Ja, das ist genau was ich brauche, danke .


----------

