Java 退出无限循环

Java 退出无限循环,java,daemon,infinite-loop,Java,Daemon,Infinite Loop,所以我有一个持续运行的守护进程,所以我放置了一段时间(true)。问题是,可能有一天它需要关闭。是否还有其他方法可以执行此操作?请执行以下操作,而不是无限循环: private volatile boolean keepRunning = true; //... your main loop while(keepRunning) { } //... public void triggerShutdown() { keepRunning = false; } 您可以使用

所以我有一个持续运行的守护进程,所以我放置了一段时间(true)。问题是,可能有一天它需要关闭。是否还有其他方法可以执行此操作?

请执行以下操作,而不是无限循环:

private volatile boolean keepRunning = true;

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


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

您可以使用
中断退出循环语句

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

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

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

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

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

}


您需要使用多线程来解决此问题。建议您对标志使用可变变量,以防止线程问题

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

在命令行中输入任何文本后,此操作将停止。

您可以使用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循环是很重要的,这样才能生效@au2al:这是真的,break是关键语句。为什么不干脆
while(!exitCondition){…}
Thread.interrupted()
是静态的,无需调用
currentThread()
first@ratchet,谢谢,有两种选择混淆了。;)如果它退出,它不再是无限的…:这个问题是这样指定的:下面的宽范围的答案显示了这一点。考虑发布一个最小的例子和进一步的解释。例如,它是多线程的吗?是否有一个“控制器”线程?什么信号“何时需要关闭”?好吧,移动到投票“不是一个真正的问题”。也许它可以变成一个。为什么不只是<代码>((?)?{…} <代码>?这样你就可以在循环的中间退出,而不是只在开始时。加上看<代码>而(真)
向下一个处理代码的人暗示这是一个长时间运行的循环。+1很公平——即使我真的不喜欢这个构造,这也是唯一一个使用
break
的答案,之前也显示了代码。既然他说他的循环使用
while(true),为什么不直接使用
while(!condition){…}
除此之外,我什么也没做。你不一定需要多线程(这个问题没有明确说明)。只要停止条件可以被通知…@pst:如果它们在同一个线程上,为什么上面的代码会中断?对我来说,这两种方式看起来都是完全安全的。
triggerShutdown()
不会阻塞,因此无论是否从无限循环中调用它都无关紧要。是的。我假设,
triggerShutdown
永远不会从
中触发,而…
,但是[vague]帖子或您的答案中没有任何固有的限制。
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();
}
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();
}