Ad esempio, questa è una traccia dello stack da un server Tomcat:Che cosa significa "bloccato" in una traccia dello stack Java?
"RMI TCP Accept-0" daemon prio=10 tid=0x091a5800 nid=0x8f1 runnable [0x8b305000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
- locked <0x911d3c30> (a java.net.SocksSocketImpl)
at java.net.ServerSocket.implAccept(ServerSocket.java:462)
at java.net.ServerSocket.accept(ServerSocket.java:430)
at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:34)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:369)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:341)
at java.lang.Thread.run(Thread.java:662)
La mia ipotesi è che "bloccato" significa che la CPU è in attesa su una sorta di una serratura. Tuttavia, se questo è il caso, perché lo stato del thread è elencato come RUNNABLE anziché BLOCKED?
Grazie.
Grazie. Quindi questo non significa che il thread sia inattivo o addormentato, che è quello che ho assunto. Vedo un sacco di discussioni come questa nel mio server Tomcat. È una condizione normale? –
@Frank LaRosa: Assolutamente. In qualsiasi momento, abbiamo tra 10 e 100 thread in quello stato sui nostri server. L'intero punto di quel thread è di aspettare fino a quando un altro server lo richiede chiedendo informazioni, e dato che di solito si vuole avere la capacità di elaborare più di una richiesta alla volta (ricerche fulltext per esempio), si avranno più connettori disponibili. –
Ma quei thread non si limitano a girare in loop usando i cicli della CPU mentre sono in attesa di una connessione, giusto? Supponendo che non lo sono, che cosa sta causando loro di non farlo? Normalmente quando creo un thread di lavoro, trascorre la maggior parte del suo tempo nello stato di ATTESA, fino a quando qualche altro thread lo notifica. In questo caso, i thread sono tutti elencati come RUNNABLE. –