2016-04-27 11 views
1

Ich realisiere ein kleines Projekt, in dem weibliche viviparous Tiere eine Schwangerschaft haben können (eine Klasse, die Runnable implementiert).Wie ruft man automatisch eine Methode auf, um einen Thread zu stoppen?

Hier ist meine Trächtigkeit Klasse:

private final class Gestation implements Runnable //inner class of Viviparous 
{             
     private boolean isWorking; 
     private Viviparous[] babies; 
     private final int time_end; 
     private int time_left; 
     private Enclosure e; 

     public Gestation(Viviparous[] b, Enclosure e) 
     { 
      if(Viviparous.this instanceof Lion) 
       this.time_end = Lion.TIME_GESTATION; 
      else if(Viviparous.this instanceof Gazelle) 
       this.time_end = Gazelle.TIME_GESTATION; 
      else if(Viviparous.this instanceof Otter) 
       this.time_end = Otter.TIME_GESTATION; 
      else 
       this.time_end = 0; 
      this.time_left = this.time_end; 
      this.e = e; 
      this.b =b; 

      this.isWorking = true; 
      new Thread(this).start(); 
     } 

     public Viviparous[] getBabies() 
     { 
      return this.babies; 
     } 

     public boolean isWorking() 
     { 
      return this.isWorking; 
     } 

     public void stop() 
     { 
      if(this.time_left == 0) 
      { 
       Thread.currentThread().stop(); 
       this.isWorking = false; 
       System.out.println("Gestation ended"); 

       Viviparous.this.calve(this.e); //calving in Enclosure e. 
      } 
     } 

     public void run() 
     { 
      while(this.isWorking) 
      { 
       this.time_left--; 
       try 
       { 
        Thread.sleep(400L); 
       } 
       catch (InterruptedException e) 
       { 
        e.printStackTrace(); 
       } 
       if((this.time_left)%10==0 && this.time_left != 0) 
        System.out.println("Gestation will end in "+this.time_left+" days."); 
      } 
     } 

} 

Ich möchte Stopp auslösen(), wenn TIME_LEFT == 0 Kurz bevor ich nicht stop() Methode hatte, nur (run), in dem die Schleife gestoppt, wenn time_left == time_end dann calve() von Viviparous.this genannt, diese letzte Methode fordert den Benutzer auf, die Babys mit einer Eingabe zu benennen. Das Problem ist, dass mein Programm den Benutzer bereits bittet, eine Option aus dem aktuellen Menü zu wählen: Ich vermute, es gibt einen Konflikt zwischen der Eingabe von Babynamen und Menüoption.

+0

'Thread.stop()' ist [unsicher und veraltet] (https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#stop()). Nenne es nicht. –

+0

Ich werde es entfernen! Die Fäden stoppen sowieso, wenn sie ihr Ende erreichen, nicht wahr? – Aleks

+0

Sie würden, aber Ihr Thread wird nie fertig, da 'isWorking' in diesem Thread nie auf falsch gesetzt wird (und nicht zuverlässig von einem anderen Thread sein kann, da es nicht flüchtig ist). –

Antwort

0

Erstellen Sie ein flüchtiges boolesches Feld (z. B. isWorking) und stellen Sie eine Methode zum Festlegen bereit. Sie können den Thread dann stoppen, indem Sie diese Methode aufrufen. Stellen Sie sicher, dass die Variable ein flüchtig ist, sonst ist es nicht bemerkt werden kann ...

private volatile boolean isWorking = true; 

public stopThread() { 
    this.isWorking = false; 
} 

Keine Notwendigkeit für deprected Thread.stop() sowieso.

+0

danke! aber ich möchte, dass der Thread automatisch stoppt. Ich untersuche Observer/Observable Pattern. – Aleks

1

Ich möchte den Thread automatisch stoppen.

Ein Thread wird beendet, wenn seine run-Methode entweder zurückkehrt oder eine Ausnahme auslöst. Wenn Sie möchten, dass der Thread gestoppt wird, geben Sie ihn unter run() ein.

Wenn Sie möchten, dass es automatisch stoppt, wenn time_left == 0, dann testen Sie time_left in der Top-Level-Schleife des Threads und lassen Sie es zurückkehren, wenn time_left == 0.