![](/img/trans.png)
[英]Java thread state transition, WAITING to BLOCKED, or RUNNABLE?
[英]Do Java threads appear to be Runnable even if they are waiting/blocked on system call?
根據我的理解,進行 select/epoll/kqueue 系統調用會阻止進行調用的線程或進程,直到套接字准備好進行 IO 或超時事件發生。 在對基於 netty 的程序進行線程轉儲分析時,我看到父組線程在進行選擇調用后處於可運行狀態,
"Parent Group1" #11 prio=5 os_prio=0 tid=0x000000001e575000 nid=0x3f98 runnable [0x000000001f2ce000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(WindowsSelectorImpl.java:296)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(WindowsSelectorImpl.java:278)
at sun.nio.ch.WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:159)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x000000076bb59088> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <0x000000076b9706b8> (a java.util.Collections$UnmodifiableSet)
- locked <0x000000076b970308> (a sun.nio.ch.WindowsSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)
at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:803)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:457)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at java.lang.Thread.run(Thread.java:745)
Java 線程是否顯示為 Runnable,即使它正在等待系統調用,或者我遺漏了什么。
正如您從轉儲中看到的那樣,是的。
僅當使用Java內置同步機制阻塞時,Java 線程才“可運行”,例如等待進入監視器(例如Object.wait
、 Thread.sleep
、 Thread.join
)。
對select
/ epoll
/ kqueue
和 JNI 的原生調用不會影響線程狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.