JAVA スレッドのお勉強

最近、プログラミングしていないなー、プログラミングしてみたいなー、ということで、プログラミングの勉強(復習)を昨日から行っています。プログラミングの勉強で問題となるのは、具体的な目的がないと文法の勉強となり、すぐに飽きてしまうこと。今回は問題意識としては希薄かもしれませんが、もう何年も前に購入してほったらかしにしてしいたJavaスレッドの本を読んで勉強をしてみることにしました (出版元でも在庫無しということなので、もう絶版かも)。

本の最後を見たら平成14年7月3日 初版 第1刷発行となっています。この本が出てすぐに購入したのかどうかは今となっては不明ですが、7,8年程前に購入して1ページも読んでいなかったことになります。Java嫌いな私ですが(苦手ということではありません)、Javaのスレッドを勉強してみよう、200ページも無いので時間をかけずに読むことができるだろう、ということで買ったのかもしれません。

本の最初に JDK1.3および1.4で確認した内容、と書かれています。今は1.5や1.6が主流でしょうか。Javaのバージョンアップにより動作が変わっているかもしれないので、1つ1つ、本に書いてあるプログラムをjavacして実行して確認してみました。

すると、どうしても本に載っている動きとあまりに違うところに遭遇。それはスレッドグループに所属しているスレッド数を取得するメソッド activeCount()。実際、本に載っているプログラム ThreadGroupTest.java を少しだけ直した以下のプログラムを作り、JDK 1.4.2 と JDK 1.5.0 で動きが違うことを確認しました。

  • テストプログラム
public class ThreadGroupTest1a {
  public static void main(String args[]){
    System.out.println("activeCount() = " +
                       Thread.currentThread().getThreadGroup().activeCount());
    Thread t = new Thread(){
      public void run(){
        while(true){} // CTRL-C でプログラムを止める
      }
    };
    System.out.println("activeCount() = " +
                       Thread.currentThread().getThreadGroup().activeCount());
    t.start();
    System.out.println("activeCount() = " +
                       Thread.currentThread().getThreadGroup().activeCount());
  }
}
  • JDK 1.4.2-18 の場合

>java -version
java version "1.4.2_18"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_18-b06)
Java HotSpot(TM) Client VM (build 1.4.2_18-b06, mixed mode)
>javac ThreadGroupTest1a.java
>java ThreadGroupTest1a
activeCount() = 1
activeCount() = 2
activeCount() = 2

  • JDK 1.5.0 の場合

>java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
Java HotSpot(TM) Client VM (build 1.5.0-b64, mixed mode, sharing)
>javac ThreadGroupTest1a.java
>java ThreadGroupTest1a
activeCount() = 1
activeCount() = 1
activeCount() = 2

1.5 を境に activeCount の動作が変わったみたいです。ただ、activeCount という名前からして、start() メソッドでスレッドを実行させてから ative なスレッドのカウントが増えるという今の実装のほうが正しいように思えます。私は動作確認は JDK 1.4.x だけでさすがに 1.3 では確認していませんが、本には JDK1.3および1.4で確認した、と書いており、JDK1.4 の initial と JDK 1.4.2-18 では本に書いてるとおりの動作になっていますので、本が間違っているわけではありません。