Java 退出无限循环
所以我有一个持续运行的守护进程,所以我放置了一段时间(true)。问题是,可能有一天它需要关闭。是否还有其他方法可以执行此操作?请执行以下操作,而不是无限循环: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; } 您可以使用
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();
}