実行環境

65. マルチスレッド・ジョブを簡単にテストするには ?

■ マルチスレッド とは ?

マルチスレッドとは複数のプログラム演算処理がひとつのジョブの中で同時に並行して
実行される処理形態のことである。
Windows でも良く見かけるプログレス・バーは典型的なマルチスレッドの例である。
例えば Chicago のダウンロードでは

  • データのダウンロード
  • プログレス・バーの表示

が同時並行で実行されている。( 実は、これに EBCDIC -> ASCII 変換も同時並行で走っている。)

Chicagoのダウンロード画面

このような同時並行処理をマルチスレッドと呼ぶ。
マルチスレッドに対して、ひとつのスレッドしか持たない処理を 「シングル・タスク」 と呼ぶ。

■ IBM System i のマルチスレッド

System i は、元々シングル・タスクでしかなかったが OS V3R7M0 あたりから
マルチスレッドの初期段階として POSIX スレッドという原始的なマルチスレッドが
ライブラリー QCPA として提供されてきたが V4R4M0 で初めて native なマルチスレッドが導入された。

ところが、例えば Java はマルチスレッド環境下でしか動作しないが、System i のジョブの多くは
マルチスレッドが使えないジョブとして現在も稼動している。
マルチスレッドを使用できるようにするにはジョブの起動の元になるジョブ記述で
マルチスレッド = *YES を指定して生成する必要があるのだが
お馴染みのジョブ記述 QGPL/QDFTJOBD は マルチスレッド = *NO である。
従って QGPL/QDFTJOBD を独自に変更しない限り、対話式ジョブでは次のように
マルチスレッドは使えないジョブとして起動されている。

マルチスレッド可能(*NO)

■ 簡単にマルチスレッド環境を作るには ?

マルチスレッド環境を作成するには

  • マルチスレッド = *YES ( ALWMLTTHREAD ) のジョブ記述を作成してその配下のジョブで実行する

  • spawn 関数によってマルチスレッド= *YES として投入する。
    ( spawn は UNIX 関数であるが QUSRTOOLSPAWN コマンドの作成方法が紹介されている。)

  • SBMJOB で マルチスレッド使用可能= *YES を指定して投入する。

の3つの方法があるが、ここで紹介するのは上記の最後の SBMJOB コマンドによる投入である。
例えば、

  SBMJOB CMD(CALL PGM(MYLIB/MYPGM)) JOB(MYPGM) ALWMLTTHD(*YES)

のようにして ALWMLTTHD (*YES) を指定して投入するとこのバッチ・ジョブは
マルチスレッド= *YES として実行される。
SHELL コマンドで Javaプログラムを実行する場合でも実は裏でこのように
マルチスレッドのジョブが投入されているのである。
Java を呼び出すたびに SBMJOB として別のジョブが起動されるのであればJava の起動が遅いはずである。
弊社では既に同じプロセス上で JNI 環境(Java Native Interface) を作るのに成功している。
JNI 環境は弊社の各製品に同梱される予定である。