java.lang.IllegalThreadStateException

2022-09-01 03:02:57

我正在使用线程。但是,当我尝试启动线程时,我得到一个异常。In concrete java.lang.IllegalThreadStateException.我的代码是:

public void readCommand() {
    readThread = new Thread("Thread for reading") {
        public void run() {
            while (running) {
                readBuffer = usbservice.receiveData();
                put(readBuffer);
            }
        }
    };
    readThread.start();
}

问题可能出在哪里?


答案 1

您正在将线程存储在字段中。如果在两个线程中调用该方法,则可以为同一线程调用两次。您需要确保 readCommand 不会被多次调用,并且如果它已经在运行,则可能不会再次启动 readThread。例如,您可以在开始之前同步该方法并检查readThread。readThread.start()


答案 2

如果线程的状态(由 检索到的不是 其他任何状态),则线程在调用 start 时将引发异常。Thread.currentThread().getState()NEW

来源;

public synchronized void start() {
    /*
     * A zero status value corresponds to state "NEW".
     */
    if (threadStatus != 0)
        throw new IllegalThreadStateException();
    group.add(this);
    start0();
    if (stopBeforeStart) {
        stop0(throwableFromStop);
    }
}

这意味着,您的线程处于其他状态之一, , , 或 。RUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED

您可以通过线程转储或 JConsole 查看线程的状态,以查看您的线程正在做什么。如果有帮助,您可以在调用之前以编程方式获取线程转储,以使用类似 tempus-fugit 之类的东西。start

更新:为了回应您的评论,如果您中断了一个线程,在您的情况下,我假设会将标志设置为false,则该线程仍将是.要“恢复”线程上的工作(再次,我假设这是您想要做的),您将再次更改标志。呼叫将失败,因为它已启动。您也可以让线程在中断时死亡,然后创建一个新的实例并“启动”该实例作为替代方案。runningRUNNABLErunningstartThread