2012-03-07 69 views
3

2基本问题:爪哇 - 扫描仪(System.in)和 “阻塞线程”

  1. 当您进行扫描出来System.in,然后你写,说,“scan.nextLine ()“,在你点击”enter“之前实际发生了什么?线程运行代码是否处于睡眠状态,并且只有在System.in中有换行符时才会唤醒它?还有什么等待人类输入的?

  2. 当一个线程“被阻塞”是否意味着它睡着了?还是仅仅意味着它不能输入某段代码,而是可能会做其他的事情?

回答

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中某个其他线程的信号,或等待给定的时间过去,以先到者为准。