我有一个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
答案 0 :(得分:4)
不要在while(true)
循环中启动foo线程。您只能在其生命周期中启动一次Thread
。
将foo.start();
移到while(true)
请参阅有关Thread类start()
方法
public void start()
使该线程开始执行; Java虚拟机调用此线程的run方法。
结果是两个线程同时运行:当前线程(从调用start方法返回)和另一个线程(执行其run方法)。
多次启动线程永远不合法。特别是,一旦完成执行,线程可能无法重新启动。
答案 1 :(得分:0)
IllegalThreadStateException
。
但是在你的情况下,如果你想要中断你的线程,那么你可以转到sleep()
,当你想要在该线程自动退出之前中断该线程上的notify()
时。