Thread erneut ausführen..

Status
Nicht offen für weitere Antworten.

nArF

Mitglied
habe folgendes problem, nachdem ich hier einiges ueber threads gelesen habe, wollte ich meine berechnungen auch in threads laufen lassen...

Code:
Thread testthread = new Thread(){  
  public void run(){ 
     int testindex = 0;
     for (int f = 0; f<10000001;f++)
	 {
	   if (f % 1000 == 0 ) testindex++;
	 } 
	    inputTArea.setText(String.valueOf(testindex));
	 } };

 private void ButtonActionPerformed(ActionEvent evt) { 
		 testthread.start();
		 inputTArea.setText("hmm test");
     }

wenn ich nun den button drücke führt er den thread nur einmal aus, und wenn ich
anstatt testthread.start(); eindfach testthread.run(); mache,
dann führt er zwar jedesmal beim drücken des buttons den thread neu aus, aber dann muss er erstmal
den kompletten testthread durchlaufen bevor er
inputTArea.setText("hmm test"); ausführt.
keine Ahnung .p

ich will halt wissen wie ich mit testthread.start(); den thread jedesmal wieder neu ausführen kann.
THX
 
Hi,

Das Problem ist das wenn die run() Methode abgearbeite wurde der Thread stirbt. Das heist du muß in der run() methode eine Schleife einbauen. Ich mache das meistens dann in dieser Art :

Code:
  public void run()
  { 
    while(true)
    {
      synchronized(this)
      {
        try
        {
          this.wait();
        }
        catch (InterruptedException ex)
        {
          break;
        }
        int testindex = 0; 
        for (int f = 0; f<10000001;f++) 
        { 
          if (f % 1000 == 0 ) testindex++; 
        } 
          inputTArea.setText(String.valueOf(testindex)); 
        } 
      }
    }

  private void ButtonActionPerformed(ActionEvent evt) 
  { 
    synchronized(this)
    {
      this.notify();
    }
    inputTArea.setText("hmm test"); 
  }

In diesem Fall mußt du den Thread aber kurz nach dem Anlegen auch starten. Der Thread geht dann in einen Synchronisierten Bereich. Dort trift er auf den Befehl das er auf ein Ereignis warten soll. Diesese Wird durch notify() in der anderen Methode erreicht.
Sollte noch was unklar sein kannst du dich ja noch mal hier melden.

Gruß chris
 
Vergiss nicht, dass wenn du selbst die Methode run() aufrufst der Code nicht in einem eigenen Thread läuft. Nur wenn du start() aufrufst, wird wirklich ein neuer Thread gestartet !! Wenn du mit 'ner IDE mit Debugging arbeitest (also ich kenn's vom JBuilder), dann kannst du dir anschauen, wie welche Threads laufen bzw. ob überhaupt eigene Threads aufgemacht werden.
 
jo thx,
das mit dem synchronized is mir zwar noch nen bissl unklar (habe nur Bsp mit variablen auf true und fasle gesehen als bedingung fuer while-schleife)

und nachdem ich den thread einfach im buttoon initialisiert habe, kann man es natuerlich auch immer wieder neu mit der methode start() starten .p

THX!

aber wenn nun der thread ausgefuhrt und beendet wird, wird er auch direkt aus dem speicher gelöscht, oder wird beim nächsten betätigen des buttons einfach ein neuer zusätzlicher thread init. und gestartet?
 
nArF hat gesagt.:
jo thx,
das mit dem synchronized is mir zwar noch nen bissl unklar (habe nur Bsp mit variablen auf true und fasle gesehen als bedingung fuer while-schleife)

Mit synchronized sagst du java das sich immer nur ein Tread in dem Block befinden kann. Zu dem wird auf ein Objekt synchronisiert, d.h. das alle Blöcke die auf das selbe Objekt synchronisiert zur gleichen Zeit nur von einem Thread benutzt werden können.

Mit while(true) erstelltst du eine Endlosschleife. Diese Schleife wird niemals beendet, es sei denn es gibt eine Nebenbedingung in der Schleife. In meiner Schleife ist das wenn dem Thread ein Interrupt (Unterbrechnung) gesendet wird. Dann löst wait() eine InterruptedException aus, welche zu folge hat das die while - Schleife mit break beendet wird.

nArF hat gesagt.:
und nachdem ich den thread einfach im buttoon initialisiert habe, kann man es natuerlich auch immer wieder neu mit der methode start() starten .p

Du mußt den Thread nur einmal starten. Der Thread wird nicht beendet, sondern reagiert nur immer wenn er ein notify erhält.

Ich hoffe es ist jetzt ein bischen klarer geworden wie diese paar Zeilen code funktionieren. Ansonsten schau dir noch mal das Kapittel über Threads und synchroniosation in einem Java - Buch an.

Gruß Chris[/b]
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben