クラス - みる会図書館


検索対象: UNIX MAGAZINE 2000年4月号
25件見つかりました。

1. UNIX MAGAZINE 2000年4月号

Java Advisor 丘 om Performance Computing Ann Wollrath をな , リフレクション JDK 1.1 から、 Java 言語は java. lang. reflect という ンの機能を放する簡単な例だ。 あるクラスやインターフェイスに関する↑帯にをみつける 興未深いノヾッケージを含むようになった。このパッケー ジは、 Java のコードがコードに関する情報をみつけ出す ためにはまず、そのクラスの java. lang. Class オプジェ クトを使って、求める情報を検索する必要がある。この ことを可能にするクラスから構成される。プログラマーが 作成したクラスやインターフェイスのフィールドやコンス CI s オプジェクトは、以下のものを入手するメソッドを トラクタ、メソッドについての情報である。コードには直 備えている。 接書かれていないが、夫行時に発見されて呼び出されるメ クラスのスー / ヾークラス ソッドも呼び出すことができる。このテクニックはリフレ そのクラスカ躾装するインターフェイス クション (Reflection) と呼ばれる。 クラスのフィールド どのような仕組みでこれが可能になるのだろうか ? コンストラクタ Java はこれまでにもクラスに関するメタデータを表現す メソッド るためにいくつかの新しい抽象概念を ( フィールドやメソ その他 ッドに対して ) 導入してきた。そして、フィールド、コン リスト 1 では、クラスに関する詳細な情報をみつけて ストラクタ、メソッドなどに関する情報を入手するために 出力するために、 CIass オプジェクトに含まれる多くのメ java. lang ℃ lass に多くのメソッドを追加してきた。 ソッドを利用している。 Java において、メソッドは一人前のオプジェクトとな CIassInfo クラスの ma ⅲメソッドが、あるクラス ( コ った。いまでは、メソッドはコードのなかで指定しなくて マンドラインの最初の引数て指定する ) の田を出力する も、 Method オプジェクトを介して呼び出すことができ ための具イ勺な処理をおこなう。クラスもしくはインター る。コンストラクタも、同様のガ去で Constructor オプ フェイスのヘッダを出力し、そのあとで該当するクラスの ジェクトを介して呼び出すことかできる。 フィールド、コンストラクタ、メソッドを出力する。 今回は、リフレクションの使い方の基本とそれカ彳殳に立 main メソッドは、 Class. forName メソッドを使って つ場面について説明する。 クラスをロードする。したがって、クラスはクラスパスに 含まれていなければならない。 ClassInfo クラスは、起動 クラスに関する情報の入手 時に引数が与えられないと ArrayIndexOutOfBounds- Exception という薄清な例外を throw する。また、要 リフレクションのもっとも基本的な使い方は、クラスの 求したクラスがクラスパス上にない場合にも ClassNot- フィールド、コンストラクタ、メソッドを出力する javap FoundException となる。プログラムを簡単にするため のようなツールを書くといった用法である。末尾のリスト に、 main メソッドでは例外に対する特別な処置をおこな 1 は、あるクラスの private と protected な構成要素を っていない。このプログラムをより元成度の高いものにす すべて出力する、 javap コマンドの -protected オプショ 49 UNIX MAGAZINE 2000.4

2. UNIX MAGAZINE 2000年4月号

Java フログラミング・ノート 1. Thread クラスのサプクラスを定義し、 run() メソッド をオ→ヾーライドした場合→サプクラスの run() メソ ッドが実行されます。 2. Thread クラスのサプクラスは定義せす、 Thread オプ ジェクトを作成するときに RunnabIe インターフェイ スを実装したクラスのインスタンスを指定した場合→ Thread クラスの run() メソッドから、さらにそのク ラスの run() メソッドか呼び出され実行されます。 3. Thread クラスのサプクラスも定義せす、 Runnable イ ンターフェイスを実装したクラスのインスタンスも指定 しなかった場合→ Thread クラスの run() メソッド を呼び出し、即座に終了します。 3 の場合は何もしないスレッドなので、実際のプログラ 2 3 4 5 (running) 。← (runnable) 、、、 実行中→実行可能 図 5 スレッドの終了ß$Ø状態多 初期状態 (initial state) 生存中 (alive) 待機中 ()a iti ng) 、△ 一時停止 1 -> (suspending)• 停止 (stopped) ムでは 1 ~ 2 の去が使われます。 スレッドの終了 3. run ( ) メソッド内で st 叩 ( ) メソッドを実行し、セキュ 2. run() メソッド内て例外またはエラーが発生し、実行を 1. run() メソッドカ症常に終了した。 スレッドは、以下の条ついすれかが成立したときに終 中断した。 了します。 リティ・マネージャーか許可した。 UNIX MAGAZINE 2000.4 つかのほかのデーモンスレッドか起動されています。 ません。 main スレッドを実行するときには、すでにいく を実行します。このスレッドはデーモンスレッドではあり FEST ファイルて指定されたクラスの main() メソッド が生成さ起重加の引数や JAR ファイル中の MANI- JavaVM か起動すると ma ⅲ ' という名前のスレッド Java VM の起動と終了 図 5 に、停止条件と状崟移の関係を示します。 すると、通常は牛 1 、 2 、 5 のいすれかになります。 stop() メソッドの使用力離奨されないこと [ 4 ] を考慮 実行し、セキュリティ・マネージャーか許可した。 5. あるスレッドが Runtime クラスの exit() メソッドを ティ・マネージャーか許可した。 4. 別のスレッドが stop() メソッドを実行し、セキュリ また、次のどちらかの条ー物ゞ成立した場合に Java VM は終了します。 1. java. lang. Runtime クラスの exit() メソッドを実行 し、セキュリティ・マネージャーか滸午可した。 2. デーモンスレッド以外のすべてのスレッドの実行カ鮗了 main メソッドの実行を終了したときに、デーモンスレ ッド以、タ V ) スレッドカ種カ作している場合は、 Java VM の 実行は終了しません。 スレッドの利用 スレッドの利用には、次の 2 つのガ去があります。 1. Thread クラスを継承するサプクラスを定義して run() メソッドをオーバーライドする。 2. Runnable インターフェイスを実装して run() メソッ ドをする。 これらの去ではほは同等のプログラムか第当できます が、どちらが適しているかはプログラムの設計によって 異なります。それぞれについて実装方法と特徴を説明し ます。 Thread クラスの Thread クラスを継承したサプクラスを定義し、そのイ ンスタンスを生成してから実行する簡単列をリスト 3 に 示します。このプログラムでは、スレッドを作成し、 i を 0 から 1 すつインクリメントして 3 回出力させています。 、一 0 47

3. UNIX MAGAZINE 2000年4月号

連載 Java Advisor— るなら、多くのエラーをチェックし、「クラス名を指定して ください。あなたの心は読めません」といった親切なメッ セージを返すようにすべきだろう。 クラスをロードしたあと、修飾子、クラス名、適切な extends 節や implements 節からなるクラスへッダを出 力するよう、 Class オプジェクトに問い合わせる。 print- Modifiers というメソッドは、該当するクラスの修飾子 を出力するのに使われる。手市子には、 public 、 private 、 protected といったアクセス修飾子や、 static 、 tran- sient 、 synchronized 、 abstract 、 final といったその他 の手市子か含まれる。インターフェイスの名称も 1 つの修 飾子として扱わ printModifiers メソッドによって出 力される。 class というキーワードではなく、 interface と いうキーワードが printModifiers によって出力されるた め、コマンドラインの引数がクラスを示しているかどうか がチェックされる。もしそうであオ L ば、 class というキー ワードか直接出力される。 次もクラスへッダである。クラス ( もしくはインターフ ェイス ) 名を出力し、それが他のクラスを継承 (extend) するかどうか、インターフェイスを実装 ( impleme Ⅱ t ) す るかどうかを調べる。 extends 節は、 implements 節の 前に出力される。スーパークラスをもたないクラスなら、 java. lang. Object がデフォルトのスーノヾークラスとして 使われる。 次の部分は見てのとおりだ。 public と protected の フィールド、コンストラクタ、メソッドをそれぞれ出力す る。フィールドに関しては、イ市子、型名、フィールド 名を出力する。コンストラクタに関しては、手箚市子、コン ストラクタ名 ( パッケージに登録されたクラス名 ) 、パラ メータ、 throw 節を出力する。そして最後に、それぞれの メソッドの市子、リターン型、メソッド名、パラメータ 型、 thr 。 w 節を出力する。 おもしろいことに、 Class. getName メソッドカ芍区す型 名では、配列型はかなり読みにくい形式になる。たとえは、 3 次元の配列である、、 lnteger[ ⅡⅡ ] " を宣言したとする と、 getName カ区す型名は、 [[[Ljava. lang ・ lnteger;" と なる。この表記は、スラッシュがすべてピリオドで置き換 えられていることを除くと、この型のイ瓦想マシン内部での 表現に近い。 このようなユーザーに不親切な表現のため、配列型は 50 出力する前に整形しておかなけれはならない。 getType- Name がそれをおこなう。酉リに対しては、その酉改」のコ ンポーネント型を調べて、その型の最後に、、 [ ] " を付け足 す。コンポーネント型は同時に配列型にもなりうるので、 多次 ) 顔己列を扱うために再帰を使っている。 このプログラムでは、それぞれのフィールド、コンス トラクタ、メソッドに対する適切な宣言を入手するのに toString を使って手抜きすることもできた。しかし、そ れは例を示すという目的にはそぐわない。また、 Method オプジェクト用の t 。 Str ⅲ g メソッドはパッケージに登録 されたメソッド名を含む。これは、クラスの言田の言当と してはやや冗長である。今回の目的のために toString メ ソッドを使わない重丿饑としては十分だ。 コンストラクタとメソッドの呼出し java. lang. Class はまた、あるクラスの特定のコンスト ラクタやメソッドを入手するためのメソッドをいくっか備 えている。いったん特定のコンストラクタ・オプジェク トを入手したら、そのコンストラクタの newlnstance メ ソッドを呼び出して、そのクラスのインスタンスを作りだ すことができる。 newlnstance メソッドは、引数の配列 を受け取って実際のコンストラクタに渡す。デフォルトの サイズを 11 として、新しい java. utiI.HashtabIe を作成 する例を以下に示す。 CIass cI = CIass. forName("java. util . HashtabIe") ; C1ass ロ types = new C1ass ロ { int . class } ; Constructor c = c1. getConstructor(types) ; Object ロ args new Object ロ { new lnteger(ll) } ; c . newlnstance(args) ; Obj ect h getConstructor は、引数としてパラメータ型の配列 をとり、そのパラメータに対するコンストラクタを返す。 Java では、、 . class" と略記すると、 Class リテラルカ甘旨定 される。そのため、 int. class はプリミテイプ型 int の Class オプジェクトを表す。 Class. forName の代わりに . class" という表言去を使って、 java. util. Hashtable の クラス・オプジェクトを参照することもできる。しかし、 ソースコードに実際の型を書かなくてもオプジェクトのコ ンストラクタを呼び出せることを強調しておきたかったの こでは、型は文字列となり、コンパイラによって パースされることさえない。 UNIX MAGAZINE 2000.4

4. UNIX MAGAZINE 2000年4月号

けしていいことばかりではありません。基本的にバケット の優先度をもとに制御するため、優先度が上位のクラスで あっても混雑してくると落とされてしまいます。 DiffServ は、よくエアラインモテルともいわれます。ファーストク ラスの搭乗客が良質なサービスを受けられるのは、座席数 が限られているからです。ファーストクラスであっても、 搭乗客があまりに多ければやはりサービスの質を下げざる をえなくなります。 すなわち、 DiffServ においてサービスの質を保っため には、あるサービスクラスに流入するトラフィックの量 を通切に制御し、それにもとづいて各ノードに適切な資源 を確保したり、割り当てたりする必要があります。視点を 変えると、各サービスクラスにどのように資源を割り当て るかをネットワーク管理の立場から決めなけれはなりませ ん。これがポリシーであり、そこからポリシー・フレーム ワークという概念が導入されます。 TCA DS ドメインは単一の管理ポリシーが適用できる最小単 位なので、ポリシーの管理は DS ドメインを単位としてお こなわれます。 DS ドメインは、ユーサーまたは謝妾する DS ドメイン から流入するバケットの量を調整するために、ほかのドメ インとのあいだに TCA (Traffic Conditioning Agree- ment) を設けることができます。 TCA カ疋されている 場合には、その DS ドメインのイングレスノードは、流入 するトラフィックの量が TCA を満たすように制御しま す。つまり、どのサービスクラスのトラフィックがどのく らいその DS ドメインに流入してよいかを制御することに より、各サービスクラスの品質を保とうとするわけです。 これは、トラフィック・プロファイルと呼ばれるに よって : 見されています。 トラフィック・プロファイルとは、あるドメインに入 ってくるバケット、あるいは出ていくバケットを制御す るための記述です。たとえば、「 DSCP が xx のものは 100Kbps まてイ吏ってよい」といった言当になります。 DS ドメインに流入するトラフィックがこの牛を満たしてい ればイン・プロファイル、満たしていなけれはアウトオ プ・プロファイルと呼はれます。つまり、上記の場合では 100Kbps まではイン・プロファイルですが、そオ LJ 丿、 -- 日ま 連載 Cyber Kansai Project—O UNIX MAGAZINE 2000.4 アウトオプ・プロファイルになってしまいます。 SLA 一方、ある DS ドメインカ甘是供するサービスについて、 利用者ないしほかの DS ドメインとのあいだで交わす取決 めを SLA (Service Level Agreement) と呼びます。 DS ドメインの管理者は、管理下にあるネットワークがそのド メインで定めた SLA を満たすように、適切な資源を保証 しなけ川まなりません。 SLA は、あるネットワークカリ用者に提供するサーピ スレベルについての合意内容を孑嗣ー場合と、複数の DS ド メイン間で交わされるサービスレベルについての合意を指 す場合があります。後者を、とくに Inter-Domain SLA と呼ぶこともあります。 複数の DS ドメイン間での合意とは、謝妾する DS ド メイン間で、相のサービスレベルを関係づけるためのも のです。 DS ドメインどうしを結びつけることで、さらに 大きな DS ドメインを及することかできます。さきほど のェアラインモデルにたとえれは、ユナイテッド航空が主 導する starA Ⅲ ance2 のようなものといえます。つまり、 参加各社カ甘是供するサービスについて一定の合意をとりか わすわけです。 DS ドメイン間の SLA では、たとえば上 流側のドメインて指定されたクラスを、一ド流側のどのクラ スに対応づけるかというルールや、イン・フロファイルま たはアウトオプ・プロファイルのトラフィックにどのトラ フィック・フロファイルを割り当て、どういったアクショ ン ( 棄却するなど ) を実行するかというルールを取り決め ます。 DS ドメイン間の TCA は、 Inter-Domain SLA をも とに導出されます。トラフィック・ストリームは、 DS ド メイン間のリンクのどちらカ、一方 C日充側 DS ドメインの ィーグレスノードまたは一ド流側 DS ドメインのイングレス ノード ) でクラス分けされたり、マーキングされたりしま す。このため、充側・一ド流側のどちらのドメインがトラ フィック制御の責任をもつかを、あらかしめ SLA て決め ておかなければなりません。しかし、いすれの場合でも、 -- ド流側の DS イングレスノードは、流入してくるトラフィ ックはかならすしも TCA に従っているとはかぎらない という前提に立ち、そのドメインにおけるローカルなポリ 2 http://www.star-alliance.com 159

5. UNIX MAGAZINE 2000年4月号

CAFE BABE リスト 3 Thread クラスの class Samp1e1 extends Thread { public static VOid main(String Samp1e1 t = new Samp1e1 ( ) ; args ロ ) t . start(); public void run() { for (int i 0 ; i く 3 ; System. out. println(" 十十 ) 1 : リスト 4 Runnable インターフェイスの実装 class Samp1e2 implements Runnab1e { public static void main(String args ロ ) Thread t = new Thread(new Samp1e2() ) ; t . start ( ) ; public void run() { fO て (int i 0 ; i く 3 ; System. out ・ println(" 十十 ) 1 : Thread クラスを継承する利点は、 Thread クラスの提 供するメソッドをオーバーライドして機能を拡張できるこ Runnable インターフェイスの実装 Runnable インターフェイスを実装したクラスを定義 し、そのインスタンスを生成してから実行する簡単な例を リスト 4 に示します。 このガ去の 1 つ目の利点は、 run() を定義するオプジェ クトと、 run() を実行するオプジェクトをう隹できること です。 Java 言語では実装の多重継承はできませんが、イ ンターフェイスを使えは複数の仕様を継承することかでき ます。 Thread クラスのメソッドをオーバーライドする 必要がなく、 run() メソッドが並行して実行できればよ い場合、つまり run() メソッドだけしか言当しない場合 は、 Thread クラスを継承する代わりに Runnable イン ターフェイスを実装すれは、ほかのクラスを継承できます ( そのほうがよい言気 t になることもあります ) 。 Thread ク ラスのメソッドをオーバーライドして機能を拡張する場合 でも、この機能拡張された Thread サプクラスを使って、 RunnabIe を実装したオプジェクトの run() メソッドを 実行させることができます。 48 2 つ目の利点は、スレッドカ躾行する処理をカプセル化 し、オプジェクトとして独立に扱えることです。たとえ は、 Runnable インターフェイスを実装したオプジェク トをキューイングし、そのキューを操作することができ ます。 3 つ目の利点は、スレッドとは独立に状態尉寺できる ことです。 Thread オプジェクトは 1 回しか並行実行で きないという制約があるため、 Thread クラスを継承した ときは、実行のたびに Thread オプジェクトを作成しな けれはなりません。このような場合には、 RunnabIe イン ターフェイスを実装したオプジェクトリ用す川ま状態 を保つことができます。 ☆ 今回は、スレッドの作成と実行、そしてスレッドの状態 について角得見しました。次回は、同期について解説する予 定です。 ( かざま・かすひろ NTT 未来ねっと研究所 ) [ 赭文献 ] [1]James Gosling, Bill Joy and Guy L. Steele, The ノ砒ん佖れ屮田 ge S 〃 ec c 佖 0 れ , 1996 (http://java ・ sun. com/docs/books/jls/index.html) [ 2 ] Tim Lindholm, Frank YelIin, ノ協いれ Machine S 〃 ec ca 厖 0 れ Second E 市 0 れ , 1999 (http://java ・ sun. com/docs/books/vmspec/2nd-edition/htmI/VM- SpecTOC. doc. html) [ 3 ] Sun Microsystems 「 Java プラットフォーム 1.2 API 仕 様」、 JDK 1.2 ドキュメント、 1998 年 (http://java ・ sun ・ com/products/jdk/l.2/ja/docs/ja/api/) [ 4 ] Sun Microsystems 「 Thread. stop 、 Thread. suspend および Thread. resume カ甘隹奨されない理山」、 JDK 1.2 ド キュメント、 1998 年 (http://java.sun ・ com/products/ jdk/l. 2/ja/docs/ja/guide/misc/threadPrimitive- Deprecation. html) [ 5 ] Mary Compione, Kathy Walrath, 〃 0 9 T ? 〃 0 07 、 ん Tasks At Once: T ん 7 ℃み , The Java TutoriaI Second Edition, 1999 (http://java.sun.com/docs/ books/tutorial/essential/threads/index. html) [ 6 ] CaIvin Austin, れんな 0 市尾 0 れ to . / 砒 , 佖 Stack Traces, Java Developer Connection, 2000 (http:// developer.Java.sun.com/developer/technicalArticles /Programming/Stacktrace/index. html) UNIX MAGAZINE 2000.4

6. UNIX MAGAZINE 2000年4月号

CAFE BABE 図 3 スレッドー状態多 初期状態 (initial state) 生存中 (alive) 実行中→実行可能 (running) ← (runnable) 、 マ、 停止 (stopped) boolean isDaemon() 図 4 スレッド生存中の犹態多 待機中 (waiting) △ 一時停止 : (suspending) ・ 、△ 生存中 (alive) 実行中 初期状態 (initial state) 実行可能 ( 「 unning) ー (runnable) ・・ . 待機中 (waiting) 一時停止 このメソッドは、ユーザースレッドであれば false を、 デーモンスレッドであれば true を返します。 スレッドの起動 start() メソッドは、スレッドの実行を開始するための void start ( ) メソッドです。 46 は危険なのて注意してください。 スにアクセスする処理をもっスレッドの実行をけ触台するの 同し理由で、コンストラクタ内で、作成中のインスタン があります。 了する前に、インスタンスへのアクセスが発生する可能性 す。したがって、サプクラスのコンストラクタカ躾行を終 クラスのコンストラクタが実行されたあとに呼び出されま を定義した場合、サプクラスのコンストラクタは Thread しないためです。たとえば、 Thread クラスのサプクラス トラクタが作成中のオプジェクトに対して並行にアクセス スレッドの生成と起動が分離されているのは、コンス StateException 例外か発生します。 レッドに対して start() を再実行すると、 IllegalThread- 実行できないという制約があります。いったん終了したス start() メソッドには、同しスレッドに対して 1 回しか このスレッド起重加の状崟移を図 3 に示します。 分岐し、スレッドを実行可能の状態にします。 ッドでユーサーレベル・スレッドを生成して制御の流れを start() メソッドを実行すると、ます内部カーネルスレ (suspending) ・ 停止 (stopped) リスト 2 Thread クラスの ru Ⅱ ( ) メソッド public void run() { if (target ! = Ⅱ u11 ) { target . run() ; 生存中のスレッド start() により作成された新しい制御の流れでは、 run( メソッドを実行します。 void run() スレッド・プログラミングでは、 run() メソッドは自動 的に実行されるため、ユーサー・プログラムか直接実行す ることはありません。もちろん run() メソッドを実行す ることもできますが、その場合には run ( ) メソッドは新 しいスレッドではなく、現在のスレッドで実行されます。 run() メソッドを実行しているあいだは、スレッドは生 存中の状態です。つまり、新しいスレッドで実行する処理 は、すべて run() メソッド内に言当することになります。 スレッドカ吽存中のあいだは、実行中、実行可能、待機 中、一亭止のいすれかの状態をとります。この状崟移 を図 4 に示します。 なお、 run() メソッドは、 java. lang. Thread クラスだ けでなく、 java. lang. Runnable クラスでも定義されてい ます。 Thread クラスの run ( ) メソッドの定義 ( リスト 2 ) を見ると、スレッドの実装によって実彳丁形態が以下の 3 不頁に分類できることが分かります。 UNIX MAGAZINE 2000.4

7. UNIX MAGAZINE 2000年4月号

CAFE BABE Java プログラミング・ノート スレッド・プログラミング ( 2 ) 風間一洋 0 Thread(Runnab1e ターケット , String 名前 ) 図 1 Thread オプジェクトと制流れ スレッドの作成と実行 UNIX MAGAZIN E 2000.4 以下のいすれかのコンストラクタを実行してインスタンス Java スレッドを利用するには、ま $Thread クラスの Thread オフジェクトの作成 に区男枻すにたんに、、スレッド " と呼ぶことにします。 ただし、説明を簡単にするために、以降では両者をとく 在します。 て制御を分岐し、 t3 で run() メソッドカ鮗了するまで存 流れとしてのスレッド 2 は t2 で start() メソッドによっ 流れを分岐しています。たとえば、図 1 において、制御の ルスレッドやユーサーレベル・スレッドを生成して制御の しかし、実際には、 start() メソッドの実彳にカーネ くなっていなけれは・いけません。 ドか終了し、かっそのオプジェクトへのリファレンスがな ジェクトがファイナライズされるためには、 run() メソッ 成さなでファイナライズされるまで存在します。オプ ジェクトとしてのスレッド 2 は、 tl でインスタンスが生 ださい。簡単な例を図 1 に示します。この図では、オプ 義のスレッド ) のライフサイクルは異なる点に注意してく ます、厳密には Thread オプジェクトと制御の流れ ( 狭 Thread オプジェクトと制御の流れ について解説し、簡単なプログラミンクイ列を紹介します。 今回は、スレッドの作成と実行、そしてスレッドの状態 きるようにするためのクラスです。 プジェクトとして抽象化し、さらにプログラムから操作で を使います。 Thread は、匍脚の流れであるスレッドをオ スレッドを利用するときは java. lang. Thread クラス new Thread() start() スレッド 2 ー : ←•run ( ) ー→ finalize() スレッド 1 を作成します。 Thread() Thread(RunnabIe ターゲット ) Thread(String 名前 ) Thread(ThreadGroup RunnabIe ターケット ) Thread(ThreadGroup Runnab1e ターケット , String 名前 ) Thread(ThreadGroup グループ , String 名前 ) グループ , グループ , ド名を指定するか、あるいは Thread オプジェクトに対 スレッド名を設定するときは、コンストラクタでスレッ スレッド名 機会をあらためて説明します ) 。 が、 Java ではスレッドのグルーフイヒが可能です信田は プを指定します。クラス名から擱則できるかもしれません タンスで、 Thread オプジェクトカ嘱するスレッドグルー グループは、 java. lang. ThreadGroup クラスのインス ジェクトを指定します。 スを実装したインスタンスで、 run() メソッドをもつオプ ターゲットは、 java. lang. Runnable インターフェイ void setName(String 名前 ) して setName() メソッドを実行します。 43

8. UNIX MAGAZINE 2000年4月号

連載 /Cyber Kansai P「0 」 ect 図 3 DiffServ モテノレ 送信側 国イングレスノード 住ィーグレスノード 回コアルータ DS ドメイン DS ドメイン 側 PHB (Per Hop Behavior) では、このように hop-by-hop での資源割当てメカニズム を基本にしています。 DiffServ におけるサーヒ、スクラスとは、けっきよくの IETF は、現在までにいくっかの PHB について標準 ところそのサービスクラスに属するバケットが各ノードで 化をおこなっています。なかでも重要なのが、 EF (Ex- どのような扱いを受けたかによって決まります。 DiffServ pedited Forwarding) PHB [ 8 ] と AF (Assured For- では、あるサービスクラスを実現するときに、各ノード warding) PHB [ 9 ] です。 でのバケットの扱いをマクロ的に制御しようと考えます。 EF PHB は、またの名をプレミアム・サービスといい、 DS ドメインのなかで、各クラスのトラフィックが受ける バケットの損失や遅延の少ない、帯域カ焉正された仮想専 扱いのことを、ヒ、ヘイビア・アグリゲート (Behavior Ag- 用線を提供するためのサービスです。この仮想専用線は、 gregate : 振舞いの集約 ) と呼びます。 とくに VoIP (Voice over (P) などのアプリケーション あるトラフィックがどのようなサービスを受けるかは、 での利用か期待されています。 そのトラフィックがどのビヘイビア・アグリゲートに割り 一方の AF PHB は、優先度では EF より下位にあるサ 当てられるかによって決定されます。これを指定するため ーピスですが、帯域か不足した場合のバケット棄却のパラ に、 IP ヘッダの TOS (Type Of Service) フィールド メータをいろいろと設定することができます。 AF PHB の上位 6 ビットを DS フィールドと呼び、 ここに DSCP は 4 つのクラスからなり、各クラスの棄却優先度 (drop ()S code point) と呼ぶ値を設定します [ 7 ] 1 。 precedence) は 1 ~ 3 の 3 つのレベルから選べます。 DS フィールドに設疋された値ごとに、どのような制御 の棄却優先度は、オリンピックのメ夘レ ( 金、銀、銅 ) に をすればいいかを定義するのが PHB (Per Hop Behav- たとえられることもあります。ネットワークか輻輳して帯 ior: ホップごとの振舞い ) です。 PHB のもっとも簡単な 域カ坏足すると、棄却優先度が 3 のバケットから落とされ 例は、 ていきます。 AF PHB を利用することで、複雑なサーピ ・あるピヘイビア・アグリゲートについて、 ( 一定時間 ) スも : 滝見できます。 最低でも X % の帯域正しよう PHB は各ノードで実装されますが、具イ勺にはバッフ ア・マネージメントやノヾケット・スケジューリングのメカ というものです。もうすこし複雑になると、 ニズムを用いて実現されます。 ・ X % の最低保証とは別に、余った或をはかの PHB と 公平に分け合い、よぶんに使えるようにしよう ポリシー・フレームワーク という場合も考えられます。 DiffServ の落し穴 DS ドメインの各ノードでは、バケットはその DSCP に対応つ、けられた PHB に従って中幻医されます。 DiffServ こまでの説明では、 DiffServ はきわめて効率的で、イ ンターネット向きの Q 。 S 制徊職構にみえます。しかし、 1 IPv6 では、これとは異なる扱いをします。 158 UNIX MAGAZINE 2000.4

9. UNIX MAGAZINE 2000年4月号

このメソッドの実行結果が false の場合は、ネ川月状態か停 止のどちらかです。 スレッドの軈と例外 されます。両者の違いは、 Java VM の終了時の挙動だけ とデーモンスレッド (daemon thread) の 2 不鶤頁に分類 Java スレッドは、ユーサースレッド (user thread) ユーサースレッドとテーモンスレッド 宣言する必要はありません。 ラスのサプクラスなので、メソッドの throws 節でとくに Sec urity Except ion クラスは Runt imeExcept ion ク させることがないように配慮されています。 プラウサで実行したとき、ほかのアプレットを勝手に停止 ますが、第三者の作った信用できないアプレットを Web たとえは、アプレットでは個々にスレッドが作成され るわけです。 に対して実行しても安全かどうかをつねにチェックしてい マネージャーを使って、 Thread クラスの多くのメソッド セキュリティ的に危険な操作てす。そこで、セキュリティ・ ほかのスレッドの状態を調べたり、実行を制御するのは ジャーか許可しなかった場合に発生します。 スタンスです。メソッドの実行をセキュリティ・マネー これは、 java. lang. SecurityException クラスのイン SecurityException 例外 ドの throws 節でとくに宣言する必要はありません。 Exception クラスのサプクラスです。したがって、メソッ IllegalThreadStateException クラスは、 Runtime- 状態に移行するのかを正しく把屋する必喫があります。 レッドやスレッドグループがどの状態にあり、どのような したがって、スレッドを用いたプログラミングでは、ス 誤って呼び出した場合にします。 プか特定の状態にあるときしか実行できないメソッドを、 ラスのインスタンスです。スレッドまたはスレッドグルー これは、 java. lang. IllegalThreadStateException ク IllegaIThreadStateException 例外 境によって例外が発生することがあります。 あるメソッドを実行したとき、スレッドの状態や実行環 UNIX MAGAZINE 2000.4 です。 Java フログラミング・ノート 45 判別するには、 isDaemon() メソッドを使います。 スレッドがユーザースレッドかデーモンスレッドかを デーモン状態の判別 か許可しない場合は、 SecurityException が発生します。 Exception が発生します。セキュリティ・マネージャー す。それ汐 ) 状態で実行すると、 IIIegalThreadState- このメソッドを実行できるのは、ネ川月状態のときだけで ります。 ると、 JavaVM カ鮗了しないという問題カ起きやすくな す。なお、デーモンスレッドでユーサースレッドを作成す を実行するのは異なるスレッドを作成する場合に限られま レッドになります。したがって、 setDaemon() メソッド ドに、デーモンスレッドが作成したスレッドはデーモンス ューサースレッドが作成したスレッドはユーザースレッ るとユーサースレッドになります。 true を指定するとデーモンスレッドに、 false を指定す void setDaemon(b001ean フラグ ) setDaemon() メソッドを使います。 ューサースレッドとデーモンスレッドの切替えには、 デーモン状態の変更 で、注意が必要です。 なのに Java VM カ鮗了しないといった問題か起きるの なお、正しく設定しないと、プログラムは終了したはす なります。 スレッドか動いているかは、 Java VM の実装によって異 ドとして利用されています。ただし、どのようなデーモン ライズ処理をおこなう、、 FinaIizer" などがデーモンスレッ オプジェクトを扱う、 Reference HandIer" 、ファイナ リファレンス・ ナルを処理する、、 Signal dispatcher を使うとよいでしよう。たとえば、 Java VM では、シグ バックグラウンド処理をおこなうためにデーモンスレッド グラムから直接アクセスできないスレッドを作成したり、 この特徴を活かして、ライプラリ内部でユーサー・プロ 了時に自重加勺に終了するスレッドといえます。 了します。つまり、デーモンスレッドは、 Java VM の終 ほかにデーモンスレッドか残っていても Java VM は終 ん。しかし、すべてのユーサースレッドカ鮗了した場合は、 ューサースレッドの動作中は Java VM は終了しませ

10. UNIX MAGAZINE 2000年4月号

連載 . /Java Advisor— る。 Java では、インターフェイスは、メソッドだけでコン ストラクタを含まない。特別なガ去で特定のインターフェ イスを実装するオプジェクトを生成したいなら、特別な引 数の組合ぜをとるコンストラクタを含むインターフェイス を実装するクラスが必要になるかもしれない。 java ・ lang ・ Class と java. lang. reflect ノヾッケージのクラスを利用す れば、正しいパラメータ型をもった Constructor オプジ ェクトか得られる。このコンストラクタ・オプジェクトを 使って新しいインスタンスを作成すればよい。 リフレクションは、朱なコンストラクタを呼び出すこ とから、特別なフィールドやメソッドを探し出すことま で、きわめて ) 2 危な可能性をなえてくれる。しかし、リフ レクションの利用は慎重におこなうべきである。リフレク ションは、プログラムにおける単純明快で直接的なイン リスト 1 import Java. lang. reflect . * ; public class C1assInf0 { ターフェイスとクラスの代用にすべきではない。リフレク ションはコードを分かりにくくする可能性があり、不幸に も、オプジェクトとメソッド・パラメータの型のチェック がおこなわれなくなる。リフレクションは、一イ財生か要求 される場面で、ほかによいガ去がないときにのみ使うよう にしよう。 Sun Microsystems の上級工ンジニアで、 Java Remote Method lnvocation システム・プロジェクトを率いている。 Sun Microsystems 研究所と MITRE では、信頼生の高い大規模な 分散処理システムと並列コンピューティングに関する研究をおこ なつな 「 Java's New Reflection 」 Performance Computing 1998 年 10 月号より ◎ 1998 , Performance Computing (). S. A. ) ・ Ann Wollrath public static void main(String ロ args) throws Exception { String name = args [ 0 ] ; CIass cI = CIass . forName(name) ; printModifiers(c1. getM0difiers() ) ; if ( ! c1. islnterface()) System. out . print("class " ) ; System. out . print()l . getName() + ” " if ()I ! = Object. class) { cl ・ getSuperc1ass ( ) ; CIass supercl if (supercl ! = null Ⅱ ! cl. islnterface() ) { System ・ out ・ print ( " ” + i[n] . getName()); 1 ; n く i . length; Ⅱ + + ) System. out . print ( " implements " + i[O] . getName()); 0 ) { cl . getlnterfaces() ; Java ・ lang. Object") + ” supercl. getName ( ) System. out . print( ( (supercl ! = Ⅱ u11 ) ? System. out . print("extends " ) ; 52 for (int Ⅱ if (i . length > C1ass ロ i UNIX MAGAZINE 2000.4