我刚刚发现我的Karaf OSGi容器有很多“新I / O工作线程”,所有这些线程都处于RUNNING状态。
我认为'服务器soket接受器'线程总是运行是合理的,因为他们“一直在监听连接”是没有用的“睡觉”。任何其他线程通常处于WAITING状态(使用不同的java机制),以使某些工作看起来让自己忙碌。
那么新的I / O工作者实际上做了什么?
"New I/O worker #31" - Thread t@772
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
- locked <37500e09> (a sun.nio.ch.Util$2)
- locked <857d58a> (a java.util.Collections$UnmodifiableSet)
- locked <63863c4b> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98)
at org.jboss.netty.channel.socket.nio.SelectorUtil.select(SelectorUtil.java:64)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:244)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35)
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:102)
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
JVisualVM显示100%'正在运行'时间和0%'等待'时间 为什么他们在每次“资源可用性检查”后都没有“睡觉”一段时间?任何其他线程是否合理设计?