2个基本问题:
当您使用 System.in 创建一个扫描仪,然后您编写“scan.nextLine()”时,在您按下“输入”之前实际发生了什么?运行代码的线程是否处于 hibernate 状态,并且仅在换行符从 System.in 进入时才被唤醒?否则它会如何等待人类输入?
当一个线程被“阻塞”时是否意味着它正在 hibernate ?或者它只是意味着它无法输入某段代码,但可以做其他事情?
最佳答案
在任何时间点,每个线程都处于一个线程状态。可能的 thread states是
NEW
:一个还没有启动的线程处于这个状态。RUNNABLE
:在 Java 虚拟机中执行的线程处于此状态。BLOCKED
:被阻塞等待监视器锁的线程处于此状态。WAITING
:无限期等待另一个线程执行特定操作的线程处于此状态。TIMED_WAITING
:一个线程正在等待另一个线程执行一个操作达到指定的等待时间,就处于这种状态。TERMINATED
:已退出的线程处于此状态。
线程执行任何代码的唯一状态是RUNNABLE
状态。
在没有足够数据可用时从 System.in
中读取会将线程置于 BLOCKED
状态。它将在那里等待更多数据到达,或者InputStream
关闭,以先发生者为准(不确定System.in
是否可以关闭,但其他流当然可以),然后再次变为 RUNNABLE
。
从技术上讲, hibernate (TIMED_WAITING
)和阻塞(BLOCKED
)不是相同的状态,但是这两种状态中的任何一种都会导致线程在继续之前等待某事执行。不同之处在于,BLOCKED
线程等待一些 I/O 操作完成(成功或出错),而 TIMED_WAITING
线程等待来自 JVM 中其他线程的信号,或给定的时间流逝,以先到者为准。
关于Java - 扫描仪(System.in)和 "Blocking a thread",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9593912/