雖然集成開發環境(IDE)可以為圖形化應用程序提供很好的調試設置
但是它不允許你調試多線程的Java服務器程序
幸運的是
有幾個工具可以做到
例如日志應用程序接口(API)和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調試器
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27413.html