所以我有一个不断运行的守护进程,所以我放了一会儿(真的)。问题是可能有一段时间需要关闭。反正有吗?
答案 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();
}
在命令行输入任何文本后,这将停止。