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.
'Thread.stop()' ist [unsicher und veraltet] (https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#stop()). Nenne es nicht. –
Ich werde es entfernen! Die Fäden stoppen sowieso, wenn sie ihr Ende erreichen, nicht wahr? – Aleks
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). –