Threads Einen Thread sich selbst schließen lassen

Tausendsassa

Aktives Mitglied
Hallo,
ist es möglich dass ein Thread sich selbst beendet sobald eine Bedingung eingetroffen ist?
Danke
Tausendsassa
 
Zuletzt bearbeitet:
Kommt auf deinen Code drauf an. Wer solche Fragen stellt, muss mit solchen Antworten rechnen. Je präziser deine Frage, desto genauer die Antwort.
 
Thread aufruf:
Java:
Thread t1 = new Thread(new EnemyFight());
private boolean first = true;
private void onDamageEnemy(java.awt.event.ActionEvent evt)                       
    {                           
        if(first == true)
        {
            first = false;
            t1.start();
        }
    }

Code im Thread:
Java:
    @Override
    public void run()
    {
        while(aktuelleHP > 0)
        {
            if(aktuelleHP <= 0)
            {
                  // Thread hier schließen
            }
        }
    }

Code wurde stark vereinfacht und dient nur zur Veranschaulichung der Lage.
 
Kannst du auch die Situation erklären?

Also so wie du das jetzt geschildert hast, bricht der Thread so und so ab, weil die run-Methode aus ist, falls hp unter 0 fällt.
 
Naja das sollte auch der Fall sein ich möchte nur verhindern dass ich eine Methode die den Thread schließen kann extra aus der Thread rufenden Klasse aufgerufen werden muss, da ich dazu ein Objekt der Klasse erstellen muss und dann eben der Konstruktor ausgeführt wird was verhindert werden soll.

Sorry für die komplizierte Ausdrucksweise 😛
 
Code:
if(hp <= null)
{
}

das ist die Abbruchbedingung ich brauche nur ne neue Möglichkeit den Thread zu schließen
 
stell dir das so vor ich habe eine klasse mit einem Button den ich zum kämpfen (es ist ein spiel 😛) drücken kann und beim ersten druck soll ein Thread gestartet werden der meinen Gegner simuliert und alle 3 Sekunden "zuschlägt". Nun will ich aber sobald er mich besiegt hat oder umgekehrt, dass der Thread gestoppt wird bzw nicht mehr speicher und co verbraucht da mein Programm eh schon langsam ist... und ich versuche das zu schaffen ohne ein Objekt der rufenden Klasse erstellen zu müssen, weshalb es toll wäre wenn ein Thread einfach sagen kann "jetzt beende ich mich"...
 
Ahja da gibt es so viele Möglichkeiten wie du das anstellen könntest.
Ansatz 1:
Du übergibst dein Spielerobjekt deinem Thread und kannst auch prüfen, ob dieser auf 0 sinkt.
Java:
class MyRunnable implements Runnable {
  private Player player;
  
  public MyRunnable(Player player) {
    this.player = player;
  }
  @Override
  public void run() {
    while(player.hp > 0 && enemy.hp > 0) {
      ...
    }
  }
}

Ansatz 2:
Du hast dein Thread Objekt, vielleicht bekommst du ja von irgendwo ein ActionEvent her und kannst in dan interrupten (also einen Thread höflich beenden - findest du viele Tutorials im Inet).
Java:
@Override
public void run() {
  try {
    while(...) {
      ...
    }
  } catch(InterruptedException e) {    
    Thread.currentThread().interrupt();
  }
}
und außerhalb eben:
Java:
public void deadAction(ActionEvent e) {
  t1.interrupt();
}

Und noch viele mehr. Vielleicht passt ja ein Ansatz für dich.
 
ok also Ansatz 1 kling sehr viel versprechend nur ich bin noch nicht ganz so fortgeschritten weshalb ich mir nicht sicher bin wie genau ich das auf meinen Fall ummünzen kann. Es ist so, dass ich ein Frame habe, dass die GUI für den Kampf beinhaltet und gleichzeitig auch des Spielers Aktionen durchführt das heißt kämpfen. Aber ich habe jetzt auch den thread der eigentlich genau das selbe tut wie der Spieler. nun bin ich auch nicht ganz sicher was mit
Java:
private Player player;
bezweckt werden soll, da ich kein solches Objekt erzeugen kann...
 
beim Ansatz 2 ist das try catch für das Thread.sleep()? weil dann verstehe ich nicht warum der Thread beendet werden sollte wenn der Thread.sleep() nicht funktioniert.
 
Naja der zweite Ansatz ist ein wenig dirty muss ich zugeben.

Hier mal wie das konzeptionell funktionieren könnte:
Java:
public class Test {

   public static void main(String...args) {
     // Methode 1
     Thread t = new Thread(new MyRunnable1(new Player()));
     t.start();

     // Methode 2
     t = new Thread(new MyRunnable2());
     t.start();
     try {
       Thread.sleep(2000);
     } catch (InterruptedException e) {
       e.printStackTrace();
     }
     t.interrupt();
   }
}

class Player {
   int hp = 100;

   public void punch() {
     hp -= 50;
   }
}

class MyRunnable1 implements Runnable {
   private Player p;

   public MyRunnable1(Player p) {
     this.p = p;
   }

   @Override
   public void run() {
     while (p.hp > 0) {
       System.out.println("Time to punch player: " + p.hp);
       p.punch();
     }
     System.out.println("Ended");
   }
}

class MyRunnable2 implements Runnable {
   private int i = 100;

   @Override
   public void run() {
     try {
       while (i > 0) {
         System.out.println("Running: " + i);
         i--;
         Thread.sleep(100);
       }
     } catch (InterruptedException e) {
       Thread.currentThread().interrupt();
     }
     System.out.println("Ended");
   }
}
 

Neue Themen


Zurück
Oben