Выйти из бесконечного цикла - PullRequest
0 голосов
/ 24 июня 2011

Итак, у меня есть демон, который постоянно работает, поэтому я поставил некоторое время (правда).Проблема в том, что может наступить момент, когда его необходимо отключить.Есть ли в любом случае, чтобы сделать это?

Ответы [ 7 ]

5 голосов
/ 24 июня 2011

Вместо бесконечного цикла сделайте что-то вроде этого:

private volatile boolean keepRunning = true;

//... your main loop 
   while(keepRunning) {
   }


//...
public void triggerShutdown() {
   keepRunning = false;
}
4 голосов
/ 24 июня 2011
while(true) {
   // code code code
   // more code

   if(quitcondition)
      break;

   // more code
}
2 голосов
/ 24 июня 2011

Вы можете выйти из цикла с помощью оператора break;.

while (true)
{
    if (exitCondition)
    {
        break;
    }
    //other work
}
1 голос
/ 24 июня 2011

вы можете использовать прерванное состояние потока демона

public class StoppableTask extends Runnable{

  private Thread thr;

  public StoppableTask(){

  }

  public void run() {
    try{
        while (true) {
          // do some stuff...
          if(Thread.interrupted())throw new InterruptedException();
          //do some more stuf
        }
    }catch(InterruptedException e){
        return;//we expect this and just stop when we get it
    }
  }

  public void tellMeToStop() {
    thr.interrupt();
  }

  public void start(){
     if(thr!=null)return;
     thr = new Thread(this);
     thr.setDeamon(true);
     thr.start();
  }

  public static void main(String[] args) {
    StoppableTask t = new StoppableTask();
    t.start();
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    br.readLine();
    t.tellMeToStop();
}

обратите внимание, что важно распространять исключения прерывания (или сбрасывать статус прерывания с помощью Thread.currentThread().interrupt()) из вызываемых методов в цикл while, чтобы это имело эффект

0 голосов
/ 24 июня 2011

Для решения этой проблемы вам понадобится многопоточность.Рекомендуется использовать переменные переменные для вашего флага, чтобы предотвратить проблемы с многопоточностью.

public class StoppableTask extends Thread {
  private volatile boolean pleaseStop;

  public void run() {
    while (!pleaseStop) {
      // do some stuff...
    }
  }

  public void tellMeToStop() {
    pleaseStop = true;
  }

  public static void main(String[] args) {
    StoppableTask t = new StoppableTask()
    t.Start();
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    br.readLine();
    t.tellMeToStop();
}

Это остановится после ввода любого текста в командной строке.

0 голосов
/ 24 июня 2011

Вы можете подождать прерывания потока вместо создания другого флага, чтобы остановить его.

// will leave the interrupt flag.
while(!Thread.currentThread().isInterrupted()) {  

}

или

while(!Thread.interrupted()) { // will clear the interrupt flag.

}
0 голосов
/ 24 июня 2011

Да. Имейте условие выхода, которое содержит оператор break.

while(true){
    if(condition){
        break;
    }
    // do stuff
}
...