我对以下陈述有疑问
当一个线程是一个新线程时,它只是一个空的 Thread 对象。尚未为其分配系统资源。当线程处于这种状态时,只能启动或停止线程。当线程处于此状态时调用除 start 或 stop 之外的任何方法都没有意义,并导致
IllegalThreadStateException
.
为什么java允许停止一个甚至没有启动的线程......在这种情况下必须调用stop()和一个新线程?
我对以下陈述有疑问
当一个线程是一个新线程时,它只是一个空的 Thread 对象。尚未为其分配系统资源。当线程处于这种状态时,只能启动或停止线程。当线程处于此状态时调用除 start 或 stop 之外的任何方法都没有意义,并导致
IllegalThreadStateException
.
为什么java允许停止一个甚至没有启动的线程......在这种情况下必须调用stop()和一个新线程?
首先不要使用已标记为的功能deprecated
。
正如文档所指示的停止,
允许停止尚未启动的线程。如果线程最终启动,它会立即终止。
此外,如果我查看其中的代码Stop
@Deprecated
public final void stop() {
// If the thread is already dead, return.
// A zero status value corresponds to "NEW".
if ((threadStatus != 0) && !isAlive()) {
return;
}
stop1(new ThreadDeath());
}
正如您从代码中看到的那样,它的设计是这样的,当 threadStatus != 0
(零状态值对应于状态“NEW”)或线程已经停止时,它会正常返回。
其他答案解决了具体问题,因此我将尝试讨论其背后的更一般的想法。
本质上,如果设计人员不允许调用方法,他们就是在尝试检测编程错误。在设计者看来,interrupt()
在线程从未启动时被调用似乎很可能是一个错误,而同样的 forstop()
似乎不太可能。
还有其他类似的例子。例如,Future#cancel()
可以多次调用。
最终,我认为存在主观性/偏好的元素,即使在某些情况下,一个显然比另一个更有意义。