Java - 扫描仪(System.in)和 "Blocking a thread"

标签 java java.util.scanner

2个基本问题:

  1. 当您使用 System.in 创建一个扫描仪,然后您编写“scan.nextLine()”时,在您按下“输入”之前实际发生了什么?运行代码的线程是否处于 hibernate 状态,并且仅在换行符从 System.in 进入时才被唤醒?否则它会如何等待人类输入?

  2. 当一个线程被“阻塞”时是否意味着它正在 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/

相关文章:

java - 我怎样才能运行这个程序?

JAVA - 使用 else if 扫描仪输入的年龄比较

java - JWindow的窗口不动

java - 如何在自定义 TextView 中连接可变文本值与固定字符串

java - 将隐藏在字符串中的随机变化的数字设置为整数

java - 扫描器仅适用于多个 Java 类中的一个

java - 扫描仪方法打开和关闭两次

java - excel poi : apply foreground color to blank cells

java - getClass().getResource在加载fxml文件中的作用是什么?

java - 在 Java 中获取输入的不同方法