2016-04-27 3 views
1

Я реализую небольшой проект, в котором у женских живородящих животных может быть гестация (класс, который реализует Runnable).Как автоматически вызывать метод для остановки потока?

Вот мой Gestation класс:

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."); 
      } 
     } 

} 

Я хотел бы, чтобы вызвать остановку(), когда TIME_LEFT == 0, прежде чем я не имел стоп метод Right(), только бежать(), в котором loop остановился, когда time_left == time_end затем вызвал calve() Viviparous.this, этот последний метод просит пользователя называть детей с помощью ввода. Проблема в том, что моя программа уже просит пользователя выбрать опцию из текущего меню: Я предполагаю, что существует конфликт между входом имени младенца и опцией меню.

+0

'Thread.stop()' [небезопасно и устарело] (https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#stop()). Не называйте это. –

+0

Я удалю его! Нитки останавливаются, когда они достигают своего конца, не так ли? – Aleks

+0

Они были бы, но ваша нить никогда не закончится, так как 'isWorking' никогда не устанавливается в false в этом потоке (и не может быть надежно от другого потока, поскольку он не является изменчивым). –

ответ

0

Создайте поле volatile boolean (например, isWorking) и предоставьте способ его установки. Затем вы можете остановить поток, вызвав этот метод. Убедитесь, что переменная является летучим, в противном случае он может не заметить ...

private volatile boolean isWorking = true; 

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

Нет необходимости для deprected Thread.stop() в любом случае.

+0

спасибо! но я хочу, чтобы поток остановился автоматически. Я просматриваю наблюдательный/наблюдаемый рисунок. – Aleks

1

Я хочу, чтобы нить прекращалась автоматически.

Поток останавливается, когда его метод запуска либо возвращает, либо генерирует исключение. Если вы хотите, чтобы поток остановился, верните его с run().

Если вы хотите, чтобы он автоматически останавливался, когда time_left == 0, тогда проверьте time_left в петле верхнего уровня потока и верните его, когда time_left == 0.

Смежные вопросы