Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser 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.
Dicke rote Texte mit Schild davor sollte man nicht überlesen:
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.
Dicke rote Texte mit Schild davor sollte man nicht überlesen:
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.
[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.
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
}
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();
}
}
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();
}
}
(, 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.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.