IllegalThreadStateException для Thread.interrupt
У меня есть 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
Если вам нужен полный код, вот он: полный код
2 ответа
Не начинайте тему while(true)
петля. Вы можете начать Thread
только один раз в своем жизненном цикле.
Переехать foo.start();
выше while(true)
Обратитесь к странице документации оракула о классе Thread start()
метод
public void start()
Заставляет этот поток начать выполнение; виртуальная машина Java вызывает метод run этого потока.
В результате два потока работают одновременно: текущий поток (который возвращается из вызова метода start) и другой поток (который выполняет свой метод run).
Никогда не разрешено начинать поток более одного раза. В частности, поток не может быть перезапущен после завершения выполнения.
IllegalThreadStateException
происходит, когда вы пытаетесь изменить состояние вашего потока или когда вы снова пытаетесь вызвать метод start в том же потоке, когда он находится в рабочем состоянии. Но в вашем случае, если вы хотите прервать ваш поток, сделайте это, чтобы перейти к sleep()
и когда вы хотите, чтобы вы прервали вызов notify()
в этом потоке, прежде чем он автоматически выйдет из спящего режима.