在线程中停止无限循环

Kob*_*ley 2 java multithreading

    Thread d = new Thread(new Runnable() {
        @Override
        public void run() {
            while(true);
        }
    });
    d.start();
Run Code Online (Sandbox Code Playgroud)

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

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

Gra*_*ray 7

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

我认为这是某种学术或面试问题.如果您无法更改线程代码,则无法添加中断或volatile布尔检查.而你不能打电话.stop()(这是不赞成的,从来不是一个好主意).

我唯一能想到的是将线程设置为守护线程.

Thread d = new Thread(new Runnable() { ... });
...
d.setDaemon(true);
d.start();
Run Code Online (Sandbox Code Playgroud)

它需要启动之前设置守护进程.这是一个黑客,但可能在问题的框架内.这不会立即终止线程,但如果最后一个非守护程序线程退出,那么该线程将被JVM杀死.

当然你也可以删除该.start()行,但这似乎超出了问题的范围. System.exit(0);也会像@MattBall指出的那样打倒JVM,但这似乎也在欺骗.


小智 5

除了杀死运行该线程的JVM之外,我看不出你如何退出循环.

一个更好的方法是至少检查线程中断:

Thread d = new Thread(new Runnable() {
   @Override
   public void run() {
      while(!Thread.currentThread().isInterrupted());
};
d.start();
d.interrupt();
Run Code Online (Sandbox Code Playgroud)