- ベストアンサー
ソースコードの流れについて
- ソースコードの流れを詳しく解説します
- 表示結果が理解できない場合は、以下のソースコードの解説を参考にしてください
- ThクラスとMain4_1_49クラスについて説明します
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
自分が予想するに質問者はstaticの意味を理解していないのではないかと予想するのですが、いかがでしょうか。 staticで宣言したフィールドはこのプログラムが実行されてから終了するまで大域変数のように使える値になります。 (ちなみにこういう値のことをstatic変数やクラス変数と言い、インスタンス変数とは区別されます) つまり、もし同時に実行することが出来るなら、Main4_1_49.countの結果はどのThクラスのインスタンスから実行しても同じ値が表示されます。 Javaでスレッドを作るにはThreadクラスのサブクラスを作って、start()を呼ぶとスレッドを作った上でrun()メソッドが実行されるというのは理解していると思います。 このプログラムでは、iの値を5まで増やしつつ、countの値も1ずつ増やしながらスレッドの生成とプライオリティの設定、スレッドの実行をしています。自分が思うに、スレッドを実行したらその瞬間に実行されたスレッドがCPUを貰えるわけではなく、スケジューリングのタイミングまで待たされると思います。その間もmainメソッドが実行されるので、countの値が増加し、スレッドもどんどん生成・実行されます。 スケジューリングのタイミングでrunメソッドが呼ばれますが、これが参照するcountフィールドはすでにスレッドが生成された時から値が増えていますから、増えた値を表示します。そのため、現在のcountフィールドの値(例えば4など)を表示し、iの値 (0)を表示して、40という表示が出ると思います。System.out.printは裏でシステムコールを呼び、コンテキストスイッチのタイミングになるので40とSystem.out.printを実行したタイミングで今のスレッドは止まって、次のスレッドが起き、同じくcountフィールドの値4を表示、以下同じくという流れだと思います。 もし、スレッドごとにそれを作った時のiの値を表示させたいなら、例えばThクラスのコンストラクターでidを取るようにすれば良いと思います。ソースで書くとこんな感じですね。 class Th extends Thread { private final int id; public Th (int id) { this.id = id; } public void run() { for (int i = 0; i < 2; i++) { System.out.print(" " + id + i); } } } public class Main4_1_49 { public static void main(String[] args) { Th[] tr = new Th[5]; for (int i = 0; i < 5; i++) { tr[i] = new Th(i); tr[i].setPriority(i + 1); tr[i].start(); } } } こうするとcountフィールドをプログラム内で共有する代わりに各々のThクラスのインスタンスにインスタンス変数としてidを持たせているので、Threadごとに別々の値を表示するようになります。 最後に、落穂拾い的にちょっとプログラムについて指摘させてください。 1. for (int i = 0; i < 5; i++)とするなら、new Th[5]で十分だと思います。new Th[6]だと1つ無駄です。 2. setPriorityの引数のint値は1から10までです。詳しくは下記JavaDoc参照。 http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#setPriority%28int%29 http://docs.oracle.com/javase/7/docs/api/constant-values.html#java.lang.Thread.MAX_PRIORITY 3. Javaのコード規約(code conventions)ではミスにつながるので次のような{}の省略をしないようになっています。もちろん、{}の省略は許されているので文法エラーにはなりませんが。 > for(int i = 0; i < 2; i++)System.out.print(" "+ Main4_1_49.count + i); http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-142311.html#449 では、頑張って。
お礼
詳しい解説ありがとうございました。大変わかりやすい解説でとても感激してます。staticの意味は「クラスで唯一の」と頭でわかっていたつもりでしたが・・・質問したソースコードでは全く理解していませんでした。参考に記載頂いたコードを実行してよくわかりました。本当にありがとうございます。