0

我有一个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

如果你需要完整的代码,这里是:完整代码

4

2 回答 2

4

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

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

Threadstart()方法参考oracle文档页面

public void start()

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

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

多次启动一个线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。

于 2015-09-25T13:08:07.790 回答
0

IllegalThreadStateException当您尝试更改线程的状态或当您尝试再次在同一线程上调用 start 方法时,一旦它处于运行状态,就会发生这种情况。但是在你的情况下,如果你想中断你的线程,让它进入sleep(),当你希望你notify()在它自动退出睡眠之前中断对该线程的调用。

于 2015-09-25T13:16:30.197 回答