big*_*ero 24 java loops infinite-loop
虽然我知道要问一点有点傻,但我还是想更多地询问它的技术观点.
无限循环的一个简单示例:
public class LoopInfinite {
public static void main(String[] args) {
for (;;) {
System.out.println("Stack Overflow");
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何从这个类的外部中断(停止)这个无限循环(例如,在继承的帮助下)?
Dav*_*ant 49
我写这个也觉得很脏,但......
在不同的线程中,您可以System.setOut()使用PrintStream实现调用,RuntimeException在您调用时会抛出一个实现println().
Sub*_*der 26
我们可以使用volatile变量实现它,我们将改变Thread并停止循环.
for(;!cancelled;) /*or while(!cancelled)*/{
System.out.println("Stackoverflow");
}
Run Code Online (Sandbox Code Playgroud)
这是编写无限循环的更好方法.
public class LoopInfinite{
private static volatile boolean cancelled=false;
public static void main(String[] args){
for(;!cancelled;) { //or while(!cancelled)
System.out.println("Stackoverflow");
}
}
public void cancel(){
cancelled=true;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以从另一个线程获取运行无限循环的线程并在其上调用中断.你必须非常确定自己在做什么,并希望被中断的线程在被中断时表现正常.
在这里,我使用违规循环命名了线程,以便于识别.请注意以下解决方案容易受到竞争条件的影响.
Thread loop = new Thread() {
public void run() {
Thread.currentThread().setName("loop");
while(true) {
System.out.print(".");
}
}
}.start();
Run Code Online (Sandbox Code Playgroud)
然后在其他一些课程中:
ThreadGroup group = Thread.currentThread().getThreadGroup();
Thread[] threads = new Thread[group.activeCount()];
group.enumerate(threads);
for(Thread t : threads) {
if(t.getName().equals("loop")) {
/* Thread.stop() is a horrible thing to use.
Use Thread.interrupt() instead if you have
any control over the running thread */
t.stop();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,在我的示例中,我假设两个线程在同一个ThreadGroup中.无法保证会出现这种情况,因此您可能需要遍历更多组.
如果你对此有一些控制权,那么这里的一个体面的模式就是while(!isInterrupted())在循环声明中使用t.interrupt()而不是使用t.stop().
即使在发布之后,我对你的唯一建议是不要这样做.你可以做到,但你真的不应该这样做.
| 归档时间: |
|
| 查看次数: |
11487 次 |
| 最近记录: |