目次へ

6. スレッドクラスの変更点

2005.10.17 株式会社四次元データ 宮澤了祐

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]

スタックトレースが追加されたことにより、スレッドの状態を取得しやすくなりました。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp