並行化されたマトリックス乗算などの計算のアプリケーションなどで、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 を使用して非常に簡単に実行できます。