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() в этом потоке, прежде чем он автоматически выйдет из спящего режима.

Другие вопросы по тегам