Java プログラミング言語は、マルチスレッド化されたプログラムのサポートを想定しています。すべての Java インタプリタは、マルチスレッド化されたプログラミング環境を提供しています。しかし、これらのインタプリタの多くは、マルチスレッドの単一プロセッサ形式しかサポートしていません。そのため、マルチプロセッサ上で実行する従来の Java インタプリタでの Java プログラムのスレッドは、完全に並行には実行されず、実際には一度に 1 つのスレッドしか実行していません。
Solaris Java VM インタプリタは、複数プロセッサのコンピューティングシステムをすべて利用しています。このインタプリタは、単一プロセスの複数スレッドを複数の CPU に同時にスケジュールできるイントリンシクス Solaris マルチスレッド機能を使用します。このため、マルチスレッド化された Java プログラムは、Solaris Java VM の元で実行すると、その並行性の程度が著しく向上します。
図 2-1 は、Java スレッドが Solaris Java VM の元でどのように動作するかを示しています。Solaris スレッドの動作については、『マルチスレッドのプログラミング』を参照してください。
並行化されたマトリックス乗算などの計算のアプリケーションなどで、Solaris スレッドを十分に活用するには、Solaris のネイティブ関数 thr_setconcurrency(3T) を使用します。これにより Solaris 本来のマルチスレッド機能が Java アプリケーションで使用でき、複数プロセッサを完全に利用することが保証されます。これは、ほとんどの Java アプリケーションおよびアプレットには必要ありません。次のコードは、これをどのように行うかの例です。
最初の要素は、MPtest_NativeTSetconc() を使用する Java アプリケーション MPtest.java です。このアプリケーションは 10 個のスレッドを生成し、各スレッドは識別行を表示してから 10,000,000 回ループし、計算の多い活動のシミュレーションを行います。
import java.applet.*; import java.io.PrintStream; import java.io.*; import java.net.*; class MPtest { static native void NativeTSetconc(); static public int THREAD_COUNT = 10; public static void main (String args[]) { int i; // set concurrency on Solaris - sets it to sysconf(_SC_NPROCESSORS_ONLN); NativeTSetconc(); // start threads client_thread clients[] = new client_thread[ THREAD_COUNT ]; for ( i = 0; i < THREAD_COUNT; ++i ){ clients[i] = new client_thread(i, System.out); clients[i].start(); } } static { System.loadLibrary("NativeThreads"); } } class client_thread extends Thread { PrintStream out; public int LOOP_COUNT = 10000000; client_thread(int num, PrintStream out){ super( "Client Thread" + Integer.toString( num ) ); this.out = out; out.println("Thread " + num); } public void run () { for( int i = 0; i < this.LOOP_COUNT ; ++i; ) { ; } } } |
2 番目の要素は、javah(1) ユーティリティによって MPtest.java から生成される C スタブファイル MPtest.c です。これを行うには、次のように入力します。
% javah -stubs MPtest.java |
3 番目の要素は、同様に javah(1) ユーティリティによって MPtest.java から生成される C ヘッダファイル MPtest.h です。これを行うには、次のように入力します。
% javah MPtest.java |
4 番目の要素は、C ライブラリインタフェースの呼び出しを実行する C 関数 NativeThreads.c です。
#include <thread.h> #include <unistd.h> void MPtest_NativeTSetconc(void *this) { thr_setconcurrency(sysconf(_SC_NPROCESSORS_ONLN)); }
最後に、4 つのファイルを Java アプリケーション MPtest.class に結合するには、次のような makefile を使用して非常に簡単に実行できます。