Java - Scanner(System.in)和“阻塞线程”

时间:2012-03-07 00:08:54

标签: java java.util.scanner

2个基本问题:

  1. 当您使用System.in制作扫描仪,然后编写“scan.nextLine()”时,在点击“输入”之前实际发生了什么?运行代码的线程是否处于休眠状态,只有当换行字符来自System.in时才会被唤醒?如何等待人类输入输入?

  2. 当线程被“阻止”时,是否意味着它已经睡着了?或者它只是意味着它不能输入某段代码,但可能正在做其他的事情?

1 个答案:

答案 0 :(得分:1)

在任何时间点,每个线程都处于一个线程状态。可能的thread states

  • NEW:尚未启动的线程处于此状态。
  • RUNNABLE:在Java虚拟机中执行的线程处于此状态。
  • BLOCKED:被阻止等待监视器锁定的线程处于此状态。
  • WAITING:无限期等待另一个线程执行特定操作的线程处于此状态。
  • TIMED_WAITING:正在等待另一个线程执行最多指定等待时间的操作的线程处于此状态。
  • TERMINATED:退出的线程处于此状态。

线程执行任何代码的唯一状态是RUNNABLE状态。

在没有足够数据可用时从System.in读取将使线程处于BLOCKED状态。它将等待以获取更多数据,或者InputStream关闭,以先发生者为准(不确定System.in是否可以关闭,但其他流肯定可以),然后再次成为RUNNABLE

从技术上讲,休眠(TIMED_WAITING)和阻塞(BLOCKED)不是相同的状态,但这些状态中的任何一个都会导致线程在继续执行之前等待某事。区别在于BLOCKED线程等待一些I / O操作完成(成功或出错),而TIMED_WAITING线程等待来自JVM中某个其他线程的信号,或者给定的一个时间过去,以先到者为准。