[英]Java - Scanner(System.in) and “Blocking a thread”
2個基本問題:
當您使用System.in制作掃描儀,然后編寫“scan.nextLine()”時,在點擊“輸入”之前實際發生了什么? 運行代碼的線程是否處於休眠狀態,只有當換行字符來自System.in時才會被喚醒? 如何等待人類輸入輸入呢?
線程被“阻止”是否意味着它已經睡着了? 或者它只是意味着它不能輸入某段代碼,但可能正在做其他的東西?
在任何時間點,每個線程都處於一個線程狀態。 可能的線程狀態是
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中某個其他線程的信號,或者給定的時間過去,以先到者為准。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.