Thread beenden

Status
Nicht offen für weitere Antworten.

elena12

Mitglied
Hallo,
ich habe folgendes Poblem. Ich habe eine Klasse geschrieben der als Thread dienen soll. In gekürzter Form sieh das ungefähr so aus:

Code:
public class Thread implements Runnable {
 Model model;
 View  view;
 


 public TetrisThread(Model model, View view){
  this.model=model;
   this.view = view;
      
 }

 public void run(){
   try {
      while (!Thread.currentThread().isInterrupted()) {
        //running = true;
       
          //try{ Thread.sleep(600); }
          //catch (InterruptedException e) { System.out.println(e);}

          for(int i=0;i<12;i++){

            if (i==5){
              model.bottomcrash= true;
              break;    
            }  
           }
            model.tuwas();
            view.tuwas();

           try{ Thread.sleep(200); }
           catch (InterruptedException e) { System.out.println(e);}
          }
           Thread.currentThread().interrupt();
           System.out.println("thread status: "+Thread.currentThread().getState() );
           running = false;
           System.out.println("running "+running);
      }

   }
   catch (ThreadDeath td) {
        System.out.println(td);
         Thread.currentThread().interrupt();
        //throw td;
   }
 }

So ungefähr sieht das dann aus. Der Thread läuft auch durch nachdem ich ihn von einer anderen Klasse her gestartet habe. Mein Problem ist nun das der Thread nach einem Durchlauf immer im status RUNNABLE verharrt. Laut meiner Recherchen müsste der Thread jedoch nach einmaligem Durchlauf der run() Methode zu ende sein. Ich habe schon versucht den Thread mit start() und run() zu starten. Bei beiden hab ich aber dasselbe Problem.
Was mach ich da falsch?
 

JPKI

Top Contributor
Deine Klasse heisst Thread! Im Paket java.lang gibt es bereits eine Klasse mit gleichem Namen. Hast du damit erst mal keine Probleme??
 

byte

Top Contributor
JPKI hat gesagt.:
Deine Klasse heisst Thread! Im Paket java.lang gibt es bereits eine Klasse mit gleichem Namen. Hast du damit erst mal keine Probleme??

Warum sollte das ein Problem sein? Dafür gibt es Imports bzw. qualifizierte Namen.

@Frage: IIRC hängt der Thread.State nicht zwangsläufig mit dem eigentlichen Task zusammen, sondern bezieht sich ausschließlich auf den Thread selber. Threads werden von der JVM auf native Threads des OS abgebildet. Diese können auch noch laufen, wenn die run() schon fertig ist. Seit Java 5 gibts z.B. CachedThreadPools, um solche Threads später wiederzuverwenden. Man muss dann keinen neuen Thread erzeugen, was Performance spart.
 
S

SlaterB

Gast
> Warum sollte das ein Problem sein? Dafür gibt es Imports bzw. qualifizierte Namen.

tolle Einstellung, mit extremen Methoden kann man nahezu alles lösen,
aber deswegen kann man das doch nicht gutheißen,

das Standardvorgehen bei jedem Standard-Java-Kurs/ Bücher/ Unterstützung durch IDEs usw sieht Operationen
new Thread()/ Thread().statischeOperation()
+ vorherigen Import vor

alles andere ist extrem fehlerträchtig/ unverständlich/ möglichst zu vermeiden,
TetrisThread ist da ein viel besserer Name, so scheint es in dem Programm ja auch zu sein

---------

und ein Thread ist nach der run-Operation zu Ende,
wie meinst du, dass sie dann noch weiterlaufen?
das Objekt ist noch da, aber es passiert nix mehr, je nach Definition ;)

9.3.1 Das Ende eines Threads
http://www.rz.uni-hohenheim.de/anw/...el_09_002.htm#Rxx365java09002040002CF1F02E102


Code:
public class TetrisThread implements Runnable {

	public void run() {
		try {
			Thread.sleep(400);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		while (!Thread.currentThread().isInterrupted()) {
			Thread.currentThread().interrupt();
		}
		System.out.println(
			"thread status: " + Thread.currentThread().isAlive());

	}

	public static void main(String[] args) {
		Thread t = new Thread(new TetrisThread());
		t.start();
		System.out.println("main: " + t.isAlive());

		try {
			Thread.sleep(600);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("main: " + t.isAlive());

	}
}

aber gut, Thread.State mag was anderes sein ;)
 

byte

Top Contributor
SlaterB hat gesagt.:
> Warum sollte das ein Problem sein? Dafür gibt es Imports bzw. qualifizierte Namen.

tolle Einstellung, mit extremen Methoden kann man nahezu alles lösen,
aber deswegen kann man das doch nicht gutheißen

Ich kann Dir haufenweise Libs nennen, wo Klassen/ Interfaces mit gleichem Namen in verschiedenen Packages existieren. Schön ists nicht, aber es gibt schlimmeres. Und was Du an der Methode extrem findest, ist mir schleierhaft. Du machst doch nix anderes, wenn Du z.B. List aus der Standard API verwendest.

und ein Thread ist nach der run-Operation zu Ende,
wie meinst du, dass sie dann noch weiterlaufen?
das Objekt ist noch da, aber es passiert nix mehr, je nach Definition ;)

Der Task ist nach der run() zuende, nicht jedoch der Thread. Darüber sollte man sich durchaus bewusst sein. Denn ein Objekt vom Typ Thread unterscheidet sich von normalen Objekten. Denn sie werden auf Threads des OS gemapt und dann halt auch vom Scheduler des Systems verwaltet. Ist die run() durchgelaufen, kann der Thread selbst noch längere Zeit existieren. Deswegen macht es durchaus Sinn, die Verwaltung der Threads gänzlich der VM zu überlassen, z.B. durch Verwendung von ExecutorService#newCachedThreadPool().

Creates a thread pool that creates new threads as needed, but will reuse previously constructed threads when they are available. These pools will typically improve the performance of programs that execute many short-lived asynchronous tasks. Calls to execute will reuse previously constructed threads if available. If no existing thread is available, a new thread will be created and added to the pool. Threads that have not been used for sixty seconds are terminated and removed from the cache.
 
S

SlaterB

Gast
> Ich kann Dir haufenweise Libs nennen

ja klar, und einen Webserver startet man auch nicht aus der eigenen
public static void main
sondern mit irgendwelchen Startprozeduren..

bitte die Anfänger-Sicht beibehalten/ berücksichtigen:
für einfache Übungsprogramme ist das eine GAU,
für fortgeschrittene User natürlich kein Problem

> Du machst doch nix anderes, wenn Du z.B. List aus der Standard API verwendest.

was hat das mit dem Benennen/ Verzicht auf Import zu tun?
 

JPKI

Top Contributor
@elena12: Es ist für einen Anfänger ungewöhnlich, das ThreadDeath-Objekt abzufangen. Lass das mal weg und probier's dann nochmal.
 

byte

Top Contributor
SlaterB hat gesagt.:
> Ich kann Dir haufenweise Libs nennen

ja klar, und einen Webserver startet man auch nicht aus der eigenen
public static void main
sondern mit irgendwelchen Startprozeduren..

bitte die Anfänger-Sicht beibehalten/ berücksichtigen:
für einfache Übungsprogramme ist das eine GAU,
für fortgeschrittene User natürlich kein Problem

> Du machst doch nix anderes, wenn Du z.B. List aus der Standard API verwendest.

was hat das mit dem Benennen/ Verzicht auf Import zu tun?

Webserver? ???:L Irgendwie reden wir wohl aneinander vorbei. Ich habe lediglich darauf hingewiesen, dass es nicht umbedingt verwerflich ist, zwei Klassen in verschiedenen Packages gleich zu benennen. Es regelt entweder der Import oder der klassifizierte Name, welche Klasse nun gemeint ist. Bei List ist das halt auch so (java.awt.List, java.util.List).
 
S

SlaterB

Gast
es ist nur dann nicht verwerflich, wenn man weiß, was man tut,
etwa wenn man externe Libs einbinden kann, Webserver startet (ein Beispiel..)
oder sonst wie alles checkt

aber eben nicht für Anfänger, da ist das ein großes Problem, kurz: verwerflich,

------

ich hab in meinem Leben noch nie java.awt.List benutzt ;)
bei automatischen Import von Eclipse muss man da auswählen, aber sonst stört das doch nicht?

würde man dagegen die eigene Klasse List benennen und eine Exemplarvariable vom Typ List drinhaben..,
ein einziges Desaster
 

elena12

Mitglied
also mein code sieht folgendermaßen aus:

Thread Klasse:

Code:
public class TetrisThread implements Runnable {
 TetrisModel model;
 ExtendedView view;
 int[][]feld;
 int[][]stoneposition;
 int[][] feldsave;
 StoneFactory factory;

 public TetrisThread(TetrisModel model, ExtendedView view,int[][]feld,int[][]feldsave,StoneFactory factory_in){
  this.model=model;
   this.view = view;
    this.feld = feld;
     this.feldsave = feldsave;
      this.factory = factory_in;
      
 }

 public void run(){

      while (!Thread.currentThread().isInterrupted()) {
       
        stoneposition = factory.getStonePosition();

          //try{ Thread.sleep(600); }
          //catch (InterruptedException e) { System.out.println(e);}

          for(int i=0;i<19;i++){

            if (i==18){
              model.bottomcrash= true;
            }

            System.out.println("bottomcrash: "+model.getBottomState());
            if(model.getBottomState()==true){
               break;
            }
            model.moveDown(feld,stoneposition,feldsave);
            view.actualizeGameField();

           try{ Thread.sleep(200); }
           catch (InterruptedException e) { e.printStackTrace();}
          }
           while (!Thread.currentThread().isInterrupted()) {
            Thread.currentThread().interrupt();
           }
          System.out.println("thread status: " + Thread.currentThread().isAlive());
          
      }
 }

Ausschnitt der Klasse die den Thread baut:
Code:
Thread t = new Thread(new TetrisThread(model,view,feld,feldsave,factory));
        t.start();
        System.out.println("main: " + t.isAlive());
         try {
         Thread.sleep(600);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      System.out.println("main: " + t.isAlive());
      System.out.println("nach dem thread");


Der Thread läuft jetzt schon durch, jedoch kommt die Ausgabe von "nach dem thread" zwischendrin, also während der Laufzeit des Threads.
Mein Ziel ist aber dass eben der Thread (der den stein fallen lässt und gleichzeitig steuerbar ist) durchläuft und dann gleich zu ende ist und danach erst mit der Fortsetzung des codes fortfährt.
Und in meiner Konsole sieht man das der thread nicht beendet ist. also leerzeilen scrollen nach unten.

Irgendwas mach ich da richig böse falsch...ich hoffe ihr könnt mir helfen.
 

elena12

Mitglied
hab ich auch schon probiert. Wenn ich die join verwende() lassen sich die steine nicht mehr steuert.Das Steuern geht ja noch über den main thread.
Hab die ganze insel schon durchgelesen...aber irgendwie lassen sich die einfachen Beispiele nicht auf meinen Quellcode übertragen.
Muss man Threads aus der main heraus aufbauen? Ich denk mal nicht...
 
S

SlaterB

Gast
was in denn das jetzt, jetzt soll die main auch was machen?
soll sie davor/ dazwischen oder danach warten?

ist doch alles Käse wenn du hier stückchenweise irgendweile Teilinfos verrätst,
oder hast eigentlich gar keine Frage mehr dazu?

alles lässt sich kinderleicht organisieren, egal ob warten/ Interaktion/ oder sonst was,
man muss es nur programmieren..
 

elena12

Mitglied
jo sorry...bin ziemlich verwirrt.
Also es ist so, der thread hat nur die aufgabe den Stein fallen zu lassen. Die KeyListener laufen noch über den main thread. Also sollten beide threads paralell laufen und der eine der den stein fallen lässt nach durchlauf seiner for schleife soll sich dann beenden und einen neuen thread starten, der einen neuen stein runterfallen lässt.

Ich weiss das dürfte eigentlich garnicht so schwer sein, aber irgendwie verwirrt mich das ganze noch ziemlich.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
Bluedaishi Klassen Thread über if Anweisung starten und von anderer Klassen über Button Beenden Java Basics - Anfänger-Themen 34
P Threads Thread und Zugriff auf externe Methode beenden Java Basics - Anfänger-Themen 4
J Thread beenden? Java Basics - Anfänger-Themen 2
pun Thread "extern" beenden Java Basics - Anfänger-Themen 4
K Thread nach X-Sekunden beenden Java Basics - Anfänger-Themen 6
G Thread in der run-Methode beenden Java Basics - Anfänger-Themen 6
M Thread beenden Java Basics - Anfänger-Themen 13
B Thread beenden! Java Basics - Anfänger-Themen 6
S Thread nach Beenden erneut starten Java Basics - Anfänger-Themen 2
D Thread soll sich selbst beenden Java Basics - Anfänger-Themen 8
W Kann Thread nicht richtig beenden. Java Basics - Anfänger-Themen 11
E Thread mit System.gc beenden Java Basics - Anfänger-Themen 2
7 Thread beenden Java Basics - Anfänger-Themen 4
F Thread-Objekte beenden/zerstören Java Basics - Anfänger-Themen 5
Y Thread von außen beenden Java Basics - Anfänger-Themen 8
B Thread beenden, aber wie? Java Basics - Anfänger-Themen 8
M thread beenden und starten ---> IllegalThreadStateExcepti Java Basics - Anfänger-Themen 2
L Thread beenden Java Basics - Anfänger-Themen 4
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
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
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
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
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben