例題(Sleep)


概要

このサンプルプログラムは、オブジェクト操作のインタフェースを用いたプログラム例です。N-クィーンの例とは違い、クラスメソッドや、クラスフィールドにアクセスする例となっています。
このプログラムは、クラスフィールドの参照、設定、クラスメソッドの呼び出しを行っています。プログラム自体には得に意味があるものではありませんが、このインタフェースの利用例として考えてください。
Java側にサーバプログラムが動作しており、このプログラムにKLIC側のクライアントプログラムが接続します。そして、KLIC側から、Sleepクラスのクラスフィールドやクラスメソッドにアクセスします。


コンパイル

他のサンプルプログラム同様に、jkディレクトリにあるソースを利用するので、トップディレクトリで、makeしてください。これにより、このサンプルプログラムが利用できるようになります。
プログラムの本体は、sample/sleep/の下にありますので、プログラムの実行は、このディレクトリで行います。


ファイル説明


実行方法

まず、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側のプログラムは、以下の処理をします。
  1. Sleepのthread_numフィールドを取得し、その値を表示する。
  2. Sleepのtimeフィールドを6に設定する。
  3. フィールドが設定されたら、Sleepのsleep()メソッドを呼ぶ[1]。
  4. Sleepのtimeフィールドを4に設定する。
  5. フィールドが設定されたら、Sleepのsleep()メソッドを呼ぶ[2]。
  6. Sleepのtimeフィールドを2に設定する。
  7. フィールドが設定されたら、Sleepのsleep()メソッドを呼ぶ[3]。
  8. これまでの3つのクラスメソッドの戻り値を待ち、戻ってきた値を表示する。
  9. 3つの呼び出しが全て戻ってきたら終了する。
[1], [2], [3]の呼び出しは、ほぼ同時に行われますが、このときのtimeのフィールドの値が異なります。よってsleepメソッドの呼び出しは、これら違った値が利用されます。よって、timeの値により、[3]のメソッド呼び出しが2秒後に値を返し、[2]の呼び出しが4秒後に値を返し、[1]の呼び出しが6秒後に値を返します。

Java側のプログラムのソースファイルは、Sleep.javaです。プログラムが実行されるとソケットの接続を待ち、接続されるとメッセージインタフェースを作成します。このインタフェースに対しては、なにもしないで、次の接続を再び待機します。
Sleepクラスのクラスフィールドは次のようなものがあります。

また、クラスメソッドとして、次のメソッドがあります。 sleep()メソッドは、まずtimeを参照し、thread_numをインクリメントします。そして、timeに指定された秒数だけスレッドを休止させます。その後に、thread_numをデクリメントします。そして、現在の時間を取得し、その時間の文字列表現と、その時点でsleep()メソッドにより休止しているメソッドの数を表した文字列を結合します。戻り値としてこの文字列を渡して、メソッドを終了します。