並列化された行列の乗算などの演算アプリケーションでは、ネイティブメソッドを使用して、thr_setconcurrency(3T) を呼び出す必要があります。これは、Java アプリケーションから同時に使用可能な資源を十分に使用して、複数のプロセッサを活用できるようにするためです。この方法は、大部分の Java アプリケーションやアプレットには必要ありません。次に、ネイティブメソッドを使用して thr_setconcurrency(3T) を呼び出す例を示します。
1 つ目の要素は、MPtest_NativeTSetconc() を使用する Java アプリケーション、MPtest.java です。このアプリケーションは、1 行ずつ識別情報を表示し、10,000,000 回ループして演算処理をシミュレートするスレッドを 10 個作成します。
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;
// sysconf (_SC_NPROCESSORS_ONLN) に
// Solaris での並列処理を設定
NativeTSetconc();
// スレッドを開始
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 です。このファイルを作成するには、次のようにコマンドを実行します。
% javac MPtest.java % javah -stubs MPtest |
3 つ目の要素は、同じく javah(1) ユーティリティを使用して、MPtest.java から作成した C ヘッダーファイルの MPtest.h です。
% javah MPtest |
4 つ目の要素は、C ライブラリインタフェースへの呼び出しを行う C 関数の NativeThreads.c です。
#include <thread.h>
#include <unistd.h>
#include <jni.h>
JNIEXPORT void JNICALL Java_MPtest_NativeTSetconc(JNIEnv *env, jclass obj) {
thr_setconcurrency(sysconf(_SC_NPROCESSORS_ONLN));
}
|
次のようなメークファイルを使用すると、4 つのファイルから、MPtest.class という Java アプリケーションを簡単に作成することができます。
# make は次の処理を行います。
# 1. make MPtest を 実行
# 2. thr_setconcurrency(_SC_NPROCESSORS_ONLN) へのネイティブ呼び出しを
# 取り込むために NativeThreads.c を作成
# 3. make lib を実行
#
# これで、LD_LIBRARY_PATH および CLASSPATH を . に設定して
#、java MPtest を実行できるようになる
JAVA_HOME=/usr/java
JH_INC1=${JAVA_HOME}/include
JH_INC2=${JAVA_HOME}/include/solaris
MPtest:
${JAVA_HOME}/bin/javac MPtest.java
(CLASSPATH=. ; export CLASSPATH ; ${JAVA_HOME}/bin/javah -stubs MPtest)
(CLASSPATH=. ; export CLASSPATH ; ${JAVA_HOME}/bin/javah -jni MPtest)
lib:
cc -G -I${JH_INC1} -I${JH_INC2} NativeThreads.c -lthread ¥
-o libNativeThreads.so
clean:
rm -rf *.class libNativeThreads.so *.h MPtest.c
|