集成開發環境(IDE)能給圖形界面應用程序提供一個很好的調試工具
但是它卻不能調試一個多線程的Java服務器程序
幸運的是
有幾種工具
例如logging應用程序接口(API)或者Java Debugger可以用來調試Java服務器程序
開發者還能使用一個系統的線程堆在任何時候觀察系統的狀態
運行服務器
然後按[ctrl] [/]
會運行一個系統線程堆
這樣將輸出當前運行的所有線程
例如
^\Full thread dump:
Thread
prio=
tid=
x
fe
nid=
x
b
waiting on monitor [
xbfffe
f
]
Thread
prio=
tid=
xafde
nid=
x
a
runnable [
x
f
x
fb
]
at
PlainSocketImpl
socketAccept(Native Method)
at
PlainSocketImpl
accept(PlainSocketImpl
java:
)
at
ServerSocket
implAccept(ServerSocket
java:
)
at
ServerSocket
accept(ServerSocket
java:
)
at co
PortListener
run(PortListener
java:
)
at java
lang
Thread
run(Thread
java:
)
Signal Dispatcher
daemon prio=
tid=
xa
f
nid=
x
af
waiting on monitor [
]
Finalizer
daemon prio=
tid=
xa
c
nid=
x
d
waiting on monitor [
x
a
x
a
b
]
at java
lang
Object
wait(Native Method)
at java
lang
ref
ReferenceQueue
remove(ReferenceQueue
java:
)
at java
lang
ref
ReferenceQueue
remove(ReferenceQueue
java:
)
at java
lang
ref
Finalizer$FinalizerThread
run(Finalizer
java:
)
Reference Handler
daemon prio=
tid=
xa
b
nid=
x
cca
waiting on monitor [
x
x
b
]
at java
lang
Object
wait(Native Method)
at java
lang
Object
wait(Object
java:
)
at java
lang
ref
Reference$ReferenceHandler
run(Reference
java:
)
VM Thread
prio=
tid=
xa
de
nid=
x
ca
runnable
VM Periodic Task Thread
prio=
tid=
xa
b
nid=
x
waiting on monitor
後面的四個線程是標准線程
而其他的則跟運行的服務器程序有關
這兩個線程被命名為Thread
和Thread
如果用Thread th = new Thread(runnable
Server
)代替Thread th = new Thread(runnable)去創建進程
你就可以命名自己要創建的線程
另外
如果你調用java
lang
Thread的setName(String)方法
你也能命名你的線程
並且可以很容易從線程堆的輸出中發現原來的Thread
是服務器程序
Server
prio=
tid=
xafde
nid=
x
a
runnable [
x
f
x
fb
]
而原來的Thread
線程現在變成了Thread
通過命名線程和取得線程堆
開發者就能看到Java虛擬機(JVM)的內部狀態
如果想得到更多信息的話
你就得去研究Java Debugger了
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27606.html