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

3

2个基本问题:

  1. 当您将System.in转换为扫描器,然后编写“scan.nextLine()”时,在按下“enter”键之前实际发生了什么?线程运行代码时是否处于休眠状态,并且只有在从System.in输入新行字符时才会被唤醒?否则它如何等待用户输入?

  2. 当线程“阻塞”时,是否意味着它正在睡眠?还是只是意味着它无法进入某个特定的代码,但可能正在执行其他任务?

1个回答

2
在任何时间点,每个线程都处于某一线程状态。可能的线程状态包括:
  • 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中的其他线程发出信号或经过一定的时间,以先发生的为准。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接