6. スレッドクラスの変更点
2005.10.17 株式会社四次元データ 宮澤了祐
マルチスレッドプログラミング 6章 スレッドクラスの変更点
- 6.1. Threadクラスの変更点
- 6.2. スタックトレースの取得
- 6.3. キャッチされない例外の取得
- 6.4. スレッドの状態の取得
- 6.5. 一ミリ秒未満のスリープ
JDK5.0ではスレッドにいくつかの変更点が加えられました。 java.lang.Threadクラスの拡張に加え、新たにjava.util.concurrentパッケージが追加されました。 concurrentパッケージは、マルチスレッド時の同期処理などに有用なクラスを提供します。
6.1. Threadクラスの変更点
JDK5.0により、以下が可能になりました。
- スタックトレースの取得
- キャッチされない例外の取得
- スレッドの状態の取得
- 1ミリ秒未満のスリープ
6.2. スタックトレースの取得
今までは例外をキャッチすることでしかスタックトレースを取得することが出来ませんでしたが、 JDK5.0で追加されたgetStackTrace()、getAllStackTrace()メソッドにより、 スレッドのスタックトレースを取得することが出来るようになりました。
getStackTrace()のサンプルpublic class ThreadSample implements Runnable { public static void main(String[] args) { StackTraceElement[] elements = Thread.currentThread().getStackTrace(); for(StackTraceElement element : elements){ System.out.println(element); } } }
getStackTrace()メソッドの返り値は、「java.lang.StackTraceElement」オブジェクトの配列です。 次のように出力されます。
java.lang.Thread.dumpThreads(Native Method) java.lang.Thread.getStackTrace(Unknown Source) ThreadSample.main(ThreadSample.java:14)
getAllStackTrace()メソッドは、現在稼動している全てのスレッドのスタックトレースを返します。 返り値はMap型で、キーはスレッド、値はそのスレッドに関するStackTraceElemntの配列が入っています。
public static void main(String[] args) { Map<Thread, StackTraceElement[]> maps = Thread.getAllStackTraces(); Iterator itr = maps.entrySet().iterator(); while(itr.hasNext()){ Map.Entry entry = (Entry) itr.next(); Thread thread = (Thread) entry.getKey(); StackTraceElement[] trace = (StackTraceElement[]) entry.getValue(); System.out.println(thread); for(int i=0; i<trace.length; i++){ System.out.println(trace[i]); } System.out.println(); } }
次のように出力されます。
Thread[Finalizer,8,system] java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(Unknown Source) java.lang.ref.ReferenceQueue.remove(Unknown Source) java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source) Thread[Reference Handler,10,system] java.lang.Object.wait(Native Method) java.lang.Object.wait(Unknown Source) java.lang.ref.Reference$ReferenceHandler.run(Unknown Source) Thread[main,5,main] java.lang.Thread.dumpThreads(Native Method) java.lang.Thread.getAllStackTraces(Unknown Source) ThreadSample.main(ThreadSample.java:15) Thread[Signal Dispatcher,10,system]
スタックトレースが追加されたことにより、スレッドの状態を取得しやすくなりました。