退出无限循环

时间:2011-06-24 16:37:41

标签: java daemon infinite-loop

所以我有一个不断运行的守护进程,所以我放了一会儿(真的)。问题是可能有一段时间需要关闭。反正有吗?

7 个答案:

答案 0 :(得分:5)

而不是无限循环,做这样的事情:

private volatile boolean keepRunning = true;

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


//...
public void triggerShutdown() {
   keepRunning = false;
}

答案 1 :(得分:4)

while(true) {
   // code code code
   // more code

   if(quitcondition)
      break;

   // more code
}

答案 2 :(得分:2)

您可以使用break;语句退出循环。

while (true)
{
    if (exitCondition)
    {
        break;
    }
    //other work
}

答案 3 :(得分:1)

你可以使用deamon线程的中断状态

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循环以使其生效非常重要

答案 4 :(得分:0)

是。具有包含语句break的退出条件。

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

答案 5 :(得分:0)

您可以等待线程被中断,而不是创建另一个标志来阻止它。

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

}

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

}

答案 6 :(得分:0)

您需要使用多线程来解决此问题。建议您为标志使用volatile变量来防止线程问题。

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();
}

在命令行输入任何文本后,这将停止。