Javaはどれだけ(57)主なスレッドを知っています
4638 ワード
Javaプログラムが起動すると、1つのスレッドがすぐに実行されます.このスレッドは通常、プログラムのメインスレッド(main thread)と呼ばれます.これはプログラムが開始されたときに実行されるためです.メインスレッドの重要性は2つの面に現れます.他のサブスレッドを生成するスレッドです. は、通常、様々なクローズ動作を実行するため、最後に実行を完了しなければならない.
メインスレッドはプログラム起動時に自動的に作成されますが、Threadオブジェクトによって制御できます.そのため、メソッドcurrentThread()を呼び出して参照を取得する必要があります.currentThread()はThreadクラスの共通の静的メンバーです.通常、static Thread currentThread()メソッドは、呼び出されたスレッドの参照を返します.プライマリ・スレッドの参照を取得すると、他のスレッドを制御するようにプライマリ・スレッドを制御できます.次の例題の復習から始めましょう.
このプログラムでは、ローカル変数tに保存されるcurrentThread()を呼び出すことにより、現在のスレッド(自然にプライマリスレッド)の参照が得られる.そして、プログラムはスレッドの情報を表示します.次に、setName()を呼び出してスレッドの内部名を変更します.スレッド情報がまた表示されます.そして、1サイクル数は5から減少し始め、数回ごとに1秒停止します.一時停止はsleep()メソッドによって行われます.Sleep()文は、遅延時間が1ミリ秒であることを明確に規定している.ループ外のtry/catchブロックに注意してください.
Threadクラスのsleep()メソッドは、InterruptedException異常を引き起こす可能性があります.このような状況は、他のスレッドが眠りのスレッドを邪魔しようとしたときに発生します.この例では、中断されたかどうかのメッセージを印刷しただけです.実際のプログラムでは、このような問題を柔軟に処理する必要があります.以下、本プログラムの出力:Current thread:Thread[main,5,main]After name change:Thread[My Thread,5,main]54321注意tを文println()におけるパラメータとして運用する際の出力の発生とする.この表示順序:スレッド名、優先度、およびグループ名.デフォルトでは、プライマリ・スレッドの名前はmainです.優先度は5で、これもデフォルト値で、mainも所属するスレッドグループの名前です.1つのスレッドグループ(thread group)は、スレッドを全体の集合として状態制御するデータ構造である.このプロセスは、独自のランタイム環境によって処理され、ここでは省略する.スレッド名が変更された後、tが出力される.今回は、新しいスレッド名が表示される.プログラムにおけるThreadクラス定義の方法をより詳細に検討する.sleep()メソッドは、ミリ秒レベルの時間指示に従って、スレッドを呼び出しから保留にします.通常の形式は、static void sleep(long milliseconds)throws InterruptedExceptionが停止した時間をミリ秒と明確に定義します.このメソッドはInterruptedException異常を引き起こす可能性があります.sleep()メソッドには、ミリ秒またはナノ秒を周期とする時間を指定できる2つ目の形式があります.static void sleep(long milliseconds,int nanoseconds)throws InterruptedExceptionの2つ目の形式は、ナノ秒を時間サイクルとして許可する場合にのみ使用できます.上記の手順に示すように、setName()を使用してスレッド名を設定し、getName()を使用してスレッド名を取得できます(この手順はプログラムには反映されません).これらの方法はいずれもThreadクラスのメンバーであり、final void setName(String threadName)final String getName()ここでthreadNameはスレッド名を指します.
シリーズ記事:
Javaはどのくらい知っていますか(上)
Javaはどのくらい知っていますか(中)
メインスレッドはプログラム起動時に自動的に作成されますが、Threadオブジェクトによって制御できます.そのため、メソッドcurrentThread()を呼び出して参照を取得する必要があります.currentThread()はThreadクラスの共通の静的メンバーです.通常、static Thread currentThread()メソッドは、呼び出されたスレッドの参照を返します.プライマリ・スレッドの参照を取得すると、他のスレッドを制御するようにプライマリ・スレッドを制御できます.次の例題の復習から始めましょう.
1 // Controlling the main Thread.
2 class CurrentThreadDemo {
3 public static void main(String args[]) {
4 Thread t = Thread.currentThread();
5 System.out.println("Current thread: " + t);
6 // change the name of the thread
7 t.setName("My Thread");
8 System.out.println("After name change: " + t);
9 try {
10 for(int n = 5; n > 0; n--) {
11 System.out.println(n);
12 Thread.sleep(1000);
13 }
14 } catch (InterruptedException e) {
15 System.out.println("Main thread interrupted");
16 }
17 }
18 }
このプログラムでは、ローカル変数tに保存されるcurrentThread()を呼び出すことにより、現在のスレッド(自然にプライマリスレッド)の参照が得られる.そして、プログラムはスレッドの情報を表示します.次に、setName()を呼び出してスレッドの内部名を変更します.スレッド情報がまた表示されます.そして、1サイクル数は5から減少し始め、数回ごとに1秒停止します.一時停止はsleep()メソッドによって行われます.Sleep()文は、遅延時間が1ミリ秒であることを明確に規定している.ループ外のtry/catchブロックに注意してください.
Threadクラスのsleep()メソッドは、InterruptedException異常を引き起こす可能性があります.このような状況は、他のスレッドが眠りのスレッドを邪魔しようとしたときに発生します.この例では、中断されたかどうかのメッセージを印刷しただけです.実際のプログラムでは、このような問題を柔軟に処理する必要があります.以下、本プログラムの出力:Current thread:Thread[main,5,main]After name change:Thread[My Thread,5,main]54321注意tを文println()におけるパラメータとして運用する際の出力の発生とする.この表示順序:スレッド名、優先度、およびグループ名.デフォルトでは、プライマリ・スレッドの名前はmainです.優先度は5で、これもデフォルト値で、mainも所属するスレッドグループの名前です.1つのスレッドグループ(thread group)は、スレッドを全体の集合として状態制御するデータ構造である.このプロセスは、独自のランタイム環境によって処理され、ここでは省略する.スレッド名が変更された後、tが出力される.今回は、新しいスレッド名が表示される.プログラムにおけるThreadクラス定義の方法をより詳細に検討する.sleep()メソッドは、ミリ秒レベルの時間指示に従って、スレッドを呼び出しから保留にします.通常の形式は、static void sleep(long milliseconds)throws InterruptedExceptionが停止した時間をミリ秒と明確に定義します.このメソッドはInterruptedException異常を引き起こす可能性があります.sleep()メソッドには、ミリ秒またはナノ秒を周期とする時間を指定できる2つ目の形式があります.static void sleep(long milliseconds,int nanoseconds)throws InterruptedExceptionの2つ目の形式は、ナノ秒を時間サイクルとして許可する場合にのみ使用できます.上記の手順に示すように、setName()を使用してスレッド名を設定し、getName()を使用してスレッド名を取得できます(この手順はプログラムには反映されません).これらの方法はいずれもThreadクラスのメンバーであり、final void setName(String threadName)final String getName()ここでthreadNameはスレッド名を指します.
シリーズ記事:
Javaはどのくらい知っていますか(上)
Javaはどのくらい知っていますか(中)