java.lang.IllegalThreadStateException

Jos*_*dez 29 java multithreading

我正在使用线程.但是,当我尝试启动一个线程时,我得到一个例外.具体来说就是java.lang.IllegalThreadStateException.我的代码是:

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

问题是什么?

Pet*_*rey 35

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


Tob*_*oby 21

调用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着,你的线程是在其他的国家之一,RUNNABLE,BLOCKED,WAITING,TIMED_WAITINGTERMINATED.

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

更新:响应你的评论,如果你打断了一个线程,在你的情况下,我假设将running标志设置为false,线程仍然是RUNNABLE.要"恢复"线程的工作(再次,我假设你想做的事情),你会running再次改变标志.呼叫start将失败,因为它已经启动.你也可以让线程在中断时死掉,然后只需创建一个新的a实例,Thread并"启动"那个作为替代.