Java报错”IllegalThreadStateException”的原因以及解决办法

  • Post category:Java

关于Java报”IllegalThreadStateException”的原因和解决办法,我来给你详细讲解一下。

原因

在Java中,当一个线程状态不适合执行操作时,就会报”IllegalThreadStateException”异常。常见的情况有以下几种:

  1. 线程已经启动,再次调用start()方法时,就会抛出该异常。
  2. 线程处于停止状态,调用resume()方法时,也会抛出该异常。
  3. 线程处于等待状态,调用stop()方法时,同样会抛出该异常。

解决办法

要解决”IllegalThreadStateException”异常,需要根据具体情况选用相应的解决办法。下面分别介绍几种常用的解决办法。

1. 线程已经启动,再次调用start()

情况一般是在多线程编程中出现。如果一个线程已经执行过start()方法,那么再次调用start()方法时,就会抛出”IllegalThreadStateException”异常。解决方法就是在创建线程对象时,只调用一次start()方法:

Thread thread = new Thread(){
    public void run(){
        // ...
    }
};

thread.start();

2. 线程处于停止状态,调用resume()

调用一个已经停止的线程的resume()方法,同样会抛出”IllegalThreadStateException”异常。解决方法是在调用suspend()方法暂停线程之前,先对其进行启动:

Thread thread = new Thread(){
    public void run(){
        // ...
    }
};

thread.start();

// 暂停线程
thread.suspend()

// 继续执行线程
thread.resume();

3. 线程处于等待状态,调用stop()

线程在等待时调用stop()方法,也会抛出”IllegalThreadStateException”异常。解决方法是在调用stop()方法前,先将线程设置为等待状态:

Thread thread = new Thread(){
    public void run(){
        synchronized(waitObj){
            try{
                // 等待waitObj对象的notify()方法
                waitObj.wait();  
            } catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
};

thread.start();

// 将线程设置为等待状态
synchronized(waitObj){
    waitObj.notify();
}   

// 停止线程
thread.stop();

以上就是关于Java报”IllegalThreadStateException”的原因和解决办法的详细解释。