在线程中停止无限循环

时间:2014-01-03 16:51:07

标签: java multithreading

    Thread d = new Thread(new Runnable() {
        @Override
        public void run() {
            while(true);
        }
    });
    d.start();

如何在不更改方法public void run()内的代码的情况下退出无限循环, 并且不使用d.stop();(不推荐的方法)。

P.S:我更喜欢发布我需要做的整个练习细节。这有点像我需要吃的东西。他们给了我一个有时进入无限循环的函数,我无法改变那个方法。

5 个答案:

答案 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时,循环的生命周期结束,然后是线程。