簡體   English   中英

即使 Java 線程在系統調用時等待/阻塞,它們是否看起來也是可運行的?

[英]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.waitThread.sleepThread.join )。

select / epoll / kqueue和 JNI 的原生調用不會影響線程狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM