【问题标题】:IllegalThreadStateException on Thread.interruptThread.interrupt 上的 IllegalThreadStateException
【发布时间】:2015-09-25 13:04:00
【问题描述】:

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

【问题讨论】:

  • 编译或运行需要很长时间?
  • @ACV 编译需要很长时间,我在 EV3 上运行它
  • 任何时候遇到异常,都应该在问题中包含其整个堆栈跟踪。
  • 我认为这发生在这里} catch(InterruptedException ex) { Thread.currentThread().interrupt(); } ,因为你试图中断一个被中断的线程。做一个ex.printStackTrace();

标签: java multithreading interrupt lejos-nxj thread-state


【解决方案1】:

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

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

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

public void start()

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

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

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

【讨论】:

  • 如果我重新定义它会怎样?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2011-01-02
    • 1970-01-01
    相关资源
    最近更新 更多