「Java」スレッドの CPU 時間を取得する

Java のスレッドの CPU 時間を取得するサンプルを書いてみたので、メモ残しておきます。

JVM のスレッドシステムを管理している ThreadMXBean インタフェースで取得できるみたいです。

・ThreadMXBean (Java Platform SE 6)
http://docs.oracle.com/javase/jp/6/api/java/lang/management/ThreadMXBean.html#isCurrentThreadCpuTimeSupported()

今回は Tomcat 上のアプリケーション ( サーブレット ) でやってみました。
doGet メソッド部分だけの抜粋になりますが、以下の感じでいけました。

protected void doGet(HttpServletRequest request,
		HttpServletResponse response) throws ServletException, IOException {
	ThreadMXBean tmb = ManagementFactory.getThreadMXBean();

	// JVM が CPU 時間の取得をサポートしているかどうかは以下のメソッドで確認可能
	// System.out.println(tmb.isCurrentThreadCpuTimeSupported());

	PrintWriter out = response.getWriter();
	out.println("<html><body>");
	
	long[] liveThreadID = tmb.getAllThreadIds();
	for (long l : liveThreadID) {
		ThreadInfo ti = tmb.getThreadInfo(l);
		// System.out.println(ti.getThreadName() + " [" + l + "] " + tmb.getThreadCpuTime(l));
		out.println(ti.getThreadName() + " [" + l + "] " + tmb.getThreadCpuTime(l));
		out.println("<br>");
	}
	
	out.println("</body></html>");
}

上記サーブレットに Web ブラウザからアクセスすると、以下のような出力が得られるはずです。

http-bio-8080-exec-3 [21] 0 
http-bio-8080-exec-2 [20] 0 
http-bio-8080-exec-1 [19] 78000500 
ajp-bio-8009-AsyncTimeout [17] 0 
ajp-bio-8009-Acceptor-0 [16] 0 
http-bio-8080-AsyncTimeout [15] 0 
http-bio-8080-Acceptor-0 [14] 0 
ContainerBackgroundProcessor[StandardEngine[Catalina]] [13] 0 
pool-2-thread-1 [12] 234001500 
pool-1-thread-1 [11] 0 
GC Daemon [10] 0 
Attach Listener [5] 0 
Signal Dispatcher [4] 0 
Finalizer [3] 0 
Reference Handler [2] 0 
main [1] 592803800 

以上です。

[ 環境情報 ]
Windows 7 SP1
Apache Tomcat 7.0.27
Java SE 6 Update 34