Thread d = new Thread(new Runnable() {
@Override
public void run() {
while(true);
}
});
d.start();
如何在不更改方法public void run()
内的代码的情况下退出无限循环,
并且不使用d.stop();
(不推荐的方法)。
答案 0 :(得分:7)
如何在不更改方法public void run()内部的代码的情况下退出无限循环,而不使用d.stop(); (弃用方法)。
我认为这是某种学术或面试问题。如果您无法更改线程代码,则无法添加中断或volatile
布尔检查。你不能打电话给.stop()
(这是不赞成的,从来不是一个好主意)。
我唯一能想到的是将线程设置为守护线程。
Thread d = new Thread(new Runnable() { ... });
...
d.setDaemon(true);
d.start();
在启动之前需要设置守护进程。这是一个黑客,但可能在问题的框架内。这不会立即杀死线程,但如果最后一个非守护程序线程退出,那么该线程将被JVM杀死。
当然你也可以删除.start()
行,但这似乎超出了问题的范围。 System.exit(0);
也会像@MattBall指出的那样关闭JVM,但这似乎也在欺骗。
答案 1 :(得分:5)
除了杀死运行该线程的JVM之外,我看不出你如何退出循环。
更好的方法是至少检查线程中断:
Thread d = new Thread(new Runnable() {
@Override
public void run() {
while(!Thread.currentThread().isInterrupted());
};
d.start();
d.interrupt();
答案 2 :(得分:3)
你做不到。异步停止线程的唯一方法是stop()
方法。但没有它,你就不能。
答案 3 :(得分:1)
如果没有.stop(),您需要更改线程本身的代码。请参阅此处here了解一些想法。
答案 4 :(得分:1)
始终避免while(true)
。试试while(running)
。那个条件应该决定循环的寿命。然后,当你设置running = false时,循环的生命周期结束,然后是线程。