マルチスレッドとは複数のプログラム演算処理がひとつのジョブの中で同時に並行して
実行される処理形態のことである。
Windows でも良く見かけるプログレス・バーは典型的なマルチスレッドの例である。
例えば Chicago のダウンロードでは
が同時並行で実行されている。( 実は、これに EBCDIC -> ASCII 変換も同時並行で走っている。)
このような同時並行処理をマルチスレッドと呼ぶ。
マルチスレッドに対して、ひとつのスレッドしか持たない処理を 「シングル・タスク」 と呼ぶ。
System i は、元々シングル・タスクでしかなかったが OS V3R7M0
あたりから
マルチスレッドの初期段階として POSIX
スレッドという原始的なマルチスレッドが
ライブラリー QCPA
として提供されてきたが V4R4M0
で初めて native なマルチスレッドが導入された。
ところが、例えば Java はマルチスレッド環境下でしか動作しないが、System i のジョブの多くは
マルチスレッドが使えないジョブとして現在も稼動している。
マルチスレッドを使用できるようにするにはジョブの起動の元になるジョブ記述で
マルチスレッド = *YES
を指定して生成する必要があるのだが
お馴染みのジョブ記述 QGPL/QDFTJOBD
は マルチスレッド = *NO
である。
従って QGPL/QDFTJOBD
を独自に変更しない限り、対話式ジョブでは次のように
マルチスレッドは使えないジョブとして起動されている。
マルチスレッド環境を作成するには
マルチスレッド = *YES
( ALWMLTTHREAD
) のジョブ記述を作成してその配下のジョブで実行する
spawn 関数によってマルチスレッド= *YES
として投入する。
( spawn は UNIX 関数であるが QUSRTOOL
に SPAWN
コマンドの作成方法が紹介されている。)
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 環境は弊社の各製品に同梱される予定である。