例題(Sleep)
概要
このサンプルプログラムは、オブジェクト操作のインタフェースを用いたプログラム例です。N-クィーンの例とは違い、クラスメソッドや、クラスフィールドにアクセスする例となっています。
このプログラムは、クラスフィールドの参照、設定、クラスメソッドの呼び出しを行っています。プログラム自体には得に意味があるものではありませんが、このインタフェースの利用例として考えてください。
Java側にサーバプログラムが動作しており、このプログラムにKLIC側のクライアントプログラムが接続します。そして、KLIC側から、Sleepクラスのクラスフィールドやクラスメソッドにアクセスします。
コンパイル
他のサンプルプログラム同様に、jkディレクトリにあるソースを利用するので、トップディレクトリで、makeしてください。これにより、このサンプルプログラムが利用できるようになります。
プログラムの本体は、sample/sleep/の下にありますので、プログラムの実行は、このディレクトリで行います。
ファイル説明
-
- main.kl1
- KLIC側のプログラム。クライアントプログラムとして動き、Java側のプログラムに接続します。接続すると、Sleepクラスにアクセスします。
-
- Sleep.java
- Java側のメインプログラム。サーバプログラムとして動き、KLIC側からの接続を待ちます。接続した後は、Java側からはなにもしません。
-
- jkディレクトリにあるメッセージインタフェースのためのプログラム
- メッセージインタフェースの機能を提供する。
実行方法
まず、Java側のサーバプログラムを起動します。
% java Sleep &
次に、KLIC側のクライアントプログラムを実行します。
% ./sleep
とすれば、KLIC側のプログラムが動作し、Java側と接続します。実行されると、まず、
thread_num = 0
time <== 6
[1] call Sleep.sleep()
time <== 4
[2] call Sleep.sleep()
time <== 2
[3] call Sleep.sleep()
のように表示されます。その後で、
[3] return("Thread = 2, Time = 1999/01/30 10:57:12")
[2] return("Thread = 1, Time = 1999/01/30 10:57:14")
[1] return("Thread = 0, Time = 1999/01/30 10:57:16")
と約2秒おきに表示され、クライアントプログラムが終了します。
プログラムの説明
このプログラムは、KLICとJavaのプログラム間で、オブジェクト操作のインタフェースを利用して、クラスメソッドを呼び出したり、クラスフィールドを参照、変更する例となっています。
KLIC側のプログラムは、以下の処理をします。
- Sleepのthread_numフィールドを取得し、その値を表示する。
- Sleepのtimeフィールドを6に設定する。
- フィールドが設定されたら、Sleepのsleep()メソッドを呼ぶ[1]。
- Sleepのtimeフィールドを4に設定する。
- フィールドが設定されたら、Sleepのsleep()メソッドを呼ぶ[2]。
- Sleepのtimeフィールドを2に設定する。
- フィールドが設定されたら、Sleepのsleep()メソッドを呼ぶ[3]。
- これまでの3つのクラスメソッドの戻り値を待ち、戻ってきた値を表示する。
- 3つの呼び出しが全て戻ってきたら終了する。
[1], [2], [3]の呼び出しは、ほぼ同時に行われますが、このときのtimeのフィールドの値が異なります。よってsleepメソッドの呼び出しは、これら違った値が利用されます。よって、timeの値により、[3]のメソッド呼び出しが2秒後に値を返し、[2]の呼び出しが4秒後に値を返し、[1]の呼び出しが6秒後に値を返します。
Java側のプログラムのソースファイルは、Sleep.javaです。プログラムが実行されるとソケットの接続を待ち、接続されるとメッセージインタフェースを作成します。このインタフェースに対しては、なにもしないで、次の接続を再び待機します。
Sleepクラスのクラスフィールドは次のようなものがあります。
-
- public static int time
- sleep()メソッドでスレッドを停止する時間を秒で指定する。
-
- public static int thread_num
- sleep()メソッドで、現在停止しているスレッドの数が設定される。
また、クラスメソッドとして、次のメソッドがあります。
-
- public static String sleep()
- 呼び出されると、timeフィールドの示す秒数だけそのスレッドを一時停止させます。
sleep()メソッドは、まずtimeを参照し、thread_numをインクリメントします。そして、timeに指定された秒数だけスレッドを休止させます。その後に、thread_numをデクリメントします。そして、現在の時間を取得し、その時間の文字列表現と、その時点でsleep()メソッドにより休止しているメソッドの数を表した文字列を結合します。戻り値としてこの文字列を渡して、メソッドを終了します。