【发布时间】:2012-03-07 00:08:53
【问题描述】:
2 个基本问题:
当您使用 System.in 制作扫描仪,然后编写“scan.nextLine()”时,在您点击“enter”之前实际发生了什么?运行代码的线程是否处于休眠状态并且仅在 System.in 中出现换行符时才被唤醒?否则它将如何等待人类输入?
当一个线程被“阻塞”时,这是否意味着它处于睡眠状态?还是仅仅意味着它不能输入某段代码,但可能在做其他事情?
【问题讨论】:
2 个基本问题:
当您使用 System.in 制作扫描仪,然后编写“scan.nextLine()”时,在您点击“enter”之前实际发生了什么?运行代码的线程是否处于休眠状态并且仅在 System.in 中出现换行符时才被唤醒?否则它将如何等待人类输入?
当一个线程被“阻塞”时,这是否意味着它处于睡眠状态?还是仅仅意味着它不能输入某段代码,但可能在做其他事情?
【问题讨论】:
在任何时间点,每个线程都处于一个线程状态。可能的thread states 是
NEW:尚未启动的线程处于此状态。RUNNABLE:在Java虚拟机中执行的线程就是这个状态。BLOCKED:阻塞等待监视器锁的线程处于此状态。WAITING:无限期等待另一个线程执行特定操作的线程处于此状态。TIMED_WAITING:一个线程正在等待另一个线程执行一个操作,直到指定的等待时间。TERMINATED:已退出的线程处于此状态。线程执行任何代码的唯一状态是RUNNABLE 状态。
在没有足够数据可用时从System.in 读取将使线程处于BLOCKED 状态。它将等待更多数据到达,或关闭InputStream,以先发生者为准(不确定System.in 是否可以关闭,但其他流肯定可以),然后变为@ 987654333@再次。
从技术上讲,睡眠 (TIMED_WAITING) 和阻塞 (BLOCKED) 不是同一种状态,但是这两种状态中的任何一种都会导致线程在继续执行之前等待某些东西。不同之处在于BLOCKED 线程等待某个 I/O 操作完成(成功或出错),而TIMED_WAITING 线程等待来自 JVM 中某个其他线程的信号,或者等待给定的时间过去,以先到者为准。
【讨论】: