我有一个问题要问下面的语句Java线程 - 为什么停止一个新的线程被允许
当一个线程是一个新的线程,它仅仅是一个空的线程对象。系统资源尚未分配到 。当一个线程处于 这个状态时,你只能启动线程或停止它。当线程处于此状态时,除启动或停止外,调用任何 方法都不会使 有意义并导致
IllegalThreadStateException
。
为什么java允许停止一个甚至没有启动的线程......在这种情况下,必须调用stop()和一个新线程?
我有一个问题要问下面的语句Java线程 - 为什么停止一个新的线程被允许
当一个线程是一个新的线程,它仅仅是一个空的线程对象。系统资源尚未分配到 。当一个线程处于 这个状态时,你只能启动线程或停止它。当线程处于此状态时,除启动或停止外,调用任何 方法都不会使 有意义并导致
IllegalThreadStateException
。
为什么java允许停止一个甚至没有启动的线程......在这种情况下,必须调用stop()和一个新线程?
首先不要使用已标记为deprecated
的功能。
由于documentation指示停止,
它允许停止尚未启动的线程。如果线程最终启动,它会立即终止。
此外,如果我看code为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
(A零个状态值对应于状态正常返回“NEW”)或者线程已经停止。
其他答案解决了具体问题,所以我会尝试谈论它背后更普遍的想法。基本上,如果设计者不允许被调用的方法,他们试图检测编程错误。在设计者的观点中,当线程从未启动时调用interrupt()
似乎可能是一个bug,而stop()
的调用看起来并不那么明显。
还有其他类似的例子。例如,可以多次调用Future#cancel()
。
最终我认为有一种主观性/偏好的元素,尽管在某些情况下比另一种更明显。
我怀疑有一个特定的情况需要发生。他们可能认为这并不重要,所以它不需要抛出异常。所以你可以自由地在线程上调用stop(),而不必确定它们是否先启动。 – Kayaman
stop()已被弃用,不应被调用,如文档所示。 –
我会以另一种方式说:为什么你应该禁止停止一个没有运行的线程? – Zane