2015-09-25 8 views
0

У меня есть Java-программа, которая требует очень много времени для компиляции.IllegalThreadStateException on Thread.interrupt

Для целей тестирования я хочу убить программу и перезапустить ее, если сборка длится долго.

Вот упрощенная версия моего кода:

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

Требуется много времени для компиляции или запуска? – ACV

+0

@ACV это займет много времени, чтобы скомпилировать, я запускаю это на EV3 – mrCyborg

+0

Каждый раз, когда у вас есть исключение, вы должны включить всю свою трассировку стека в свой вопрос. – VGR

ответ

4

Не запускать foo нить в while(true) петля. Вы можете запустить Thread только один раз в своем жизненном цикле.

Move foo.start(); выше while(true)

Обратитесь к оракулу странице документации о Thread класса start() метод

public void start() 

Причины этой темы, чтобы начать выполнение; виртуальная машина Java вызывает метод запуска этого потока.

В результате два потока запускаются одновременно: текущий поток (который возвращается от вызова к методу запуска) и другой поток (который выполняет его метод запуска).

Нельзя начинать тему более одного раза. В частности, нить не может быть перезапущена после завершения выполнения.

+0

что, если я его переопределю? – mrCyborg

0

IllegalThreadStateException возникает при попытке изменить состояние вашего потока или при попытке повторного вызова метода запуска на одном потоке, когда он находится в рабочем состоянии. Но в вашем случае, если вы хотите прервать свою нить, сделайте это, чтобы перейти к sleep(), и когда вы хотите, чтобы вы прерывали вызов notify() в этом потоке, прежде чем он автоматически выйдет из-под сна.