Thread.interrupt上的IllegalThreadStateException

时间:2015-09-25 13:04:01

标签: java multithreading interrupt lejos-nxj thread-state

我有一个java程序,需要很长时间才能编译。

出于测试目的,我想杀死程序并在编译需要很长时间时重新启动它。

以下是我的代码的简化版本:

public class Main {

    public static void main(String[] args) {
        Thread foo = new Thread(new Foo());
        while (true) {
            foo.start();
            while (true) {
                if (needRestart()) {
                    foo.interrupt();
                    break;
                }
            }
        }
    }

}

foo.java看起来有点像这样:

public class Foo implements Runnable {
    // some code
    public void run () {
        try {
            while (!Thread.currentThread().isInterrupted()) {
                // some code
            }
        } catch(InterruptedException ex) {
            Thread.currentThread().interrupt();
        }       
    }
}

问题是该程序崩溃并抛出IllegalThreadStateException

如果您需要完整的代码,请点击此处:full code

2 个答案:

答案 0 :(得分:4)

不要在while(true)循环中启动foo线程。您只能在其生命周期中启动一次Thread

foo.start();移到while(true)

之上

请参阅有关Threadstart()方法

的oracle文档页面
public void start()
  

使该线程开始执行; Java虚拟机调用此线程的run方法。

     

结果是两个线程同时运行:当前线程(从调用start方法返回)和另一个线程(执行其run方法)。

     

多次启动线程永远不合法。特别是,一旦完成执行,线程可能无法重新启动。

答案 1 :(得分:0)

当您尝试更改线程的状态或尝试在同一线程处于运行状态时再次调用start方法时,会出现

IllegalThreadStateException。 但是在你的情况下,如果你想要中断你的线程,那么你可以转到sleep(),当你想要在该线程自动退出之前中断该线程上的notify()时。