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_WAITING或TERMINATED.
您可以通过线程转储或JConsole查看线程的状态,以查看您正在执行的操作.您可以在调用之前以编程方式获取线程转储,如果有帮助的话,可以start使用类似tempus-fugit的东西.
更新:响应你的评论,如果你打断了一个线程,在你的情况下,我假设将running标志设置为false,线程仍然是RUNNABLE.要"恢复"线程的工作(再次,我假设你想做的事情),你会running再次改变标志.呼叫start将失败,因为它已经启动.你也可以让线程在中断时死掉,然后只需创建一个新的a实例,Thread并"启动"那个作为替代.