システムインタフェース

第 2 章 Java プログラミング

Java とは

JavaTM は、次の特徴を持つ最近開発されたコンカレントなクラスをベースとしたオブジェクト指向のプログラミング言語です。

Java プログラミング環境

Java のプログラミングは、テキストエディタ、make(1S)、および以下のものによって Solaris Java Virtual Machine (以降 Solaris Java VM とします) でサポートされています。

javac

Java コンパイラ。Java ソースコードファイル (name.java) インタプリタ (java(1)) が処理できるバイトコードファイル (name.class) に翻訳する。Java アプリケーションと Java アプレットの両方がコンパイルされる。

javald

ラッパージェネレータ。Java アプリケーションのコンパイルと実行に必要な環境を取り込むラッパーを作成する。ラッパーが呼び出されるまで指定されたパスが結合されないので、ラッパーは JAVA_HOME および CLASSPATH パスの再配置を考慮している。

java

Java インタプリタ。コマンドとして呼び出して Java アプリケーションを実行したり、HTML コードによってブラウザから呼び出してアプレットを実行したりできる。 

appletviewer

Java アプレットビューワ。このコマンドは、指定されたドキュメントまたは資源を表示し、ドキュメントが参照している各アプレットを実行する。 

javap

Java クラスファイルの逆アセンブラ。javac によってコンパイルされたバイトコードのクラスファイルを逆アセンブルし、結果を標準出力に出力する。

javah

C ヘッダおよびスタブファイルジェネレータ。指定されたクラスごとに、classname.h という名前のヘッダファイルを作成してカレントディレクトリに入れる。またオプションで、C ソーススタブファイルを生成する。

make(1S) の使用方法については、『プログラミングユーティリティ』を参照してください。

通常の Java 環境変数は、次のとおりです。

変数 

説明 

JAVA_HOME

Java ソフトウェアのベースディレクトリのパス。たとえば、javacjavaappletviewerjavapjavah は、すべて $JAVA_HOME/bin にある。Solaris Java VM を使用するために設定する必要はない。

CLASSPATH

アプリケーションおよびアプレットで使用するためのコンパイル済み *.class ファイルを持つディレクトリへのパスがコロン (:) で区切られたリスト。javacjavajavapjavah によって使用される。設定しないと、すべての Solaris Java VM 実行可能ファイルは、/usr/java/lib/classes.zip をデフォルトとする。Solaris Java VM を使用するために設定する必要はない。

PATH

通常の実行可能ファイル検索リストに、$JAVA_HOME/bin を入れることができる。


注 -

Java VM ツールは /usr/java/bin にインストールされ、各実行可能ファイルへのシンボリックリンクは、/usr/bin に格納されます。これは、新たにインストールされる Java VM パッケージを使用するためにユーザの PATH 変数に何も追加する必要がないことを意味します。また、すべての Java VM 実行可能ファイルは、パス /usr/java/lib/classes.zip をデフォルトとして標準 Java クラスライブラリを見つけます。


ベース Java プログラミング環境は、デバッガを提供していません。デバッガは、別売りの Java WorkShopTM パッケージに含まれています。

Java プログラム

Java プログラムは、アプリケーションとアプレットという 2 つの形式で作成されます。

Java アプリケーションを実行するには、コマンド行から Java インタプリタを呼び出し、コンパイル済みアプリケーションを持つファイルを指定します。

Java アプレットは、ブラウザから呼び出します。ブラウザによって解釈される HTML コードは、コンパイル済みアプレットを持つファイル名を指定します。こうすると、ブラウザは Java インタプリタを呼び出し、インタプリタがアプレットをロードして実行します。

アプリケーション

例 2-1 は、"Hello World" を標準出力に表示するだけのアプリケーションのソースです。メソッドは、呼び出し時に引数を受け入れますが、それらを使用して何も行いません。


例 2-1 Java アプリケーション

//
// HelloWorld Application
//
class HelloWorldApp{
	public static void main (String args[]) {
		System.out.println ("Hello World");
	}
}

C と同様に最初に実行されるメソッド、すなわち関数は main として識別されます。キーワード public によって、メソッドは誰でも実行できます。staticmainHelloWorldApp クラスを参照させ、クラスの他のどのインスタンスも参照させません。voidmain が何も戻さないことを示し、args[]String 型の配列を宣言しています。

アプリケーションは、次のようにコンパイルします。


$ javac HelloWorldApp.java

また、次のように実行します。


$ java HelloWorldApp arg1 arg2 ...

アプレット

例 2-2 は、例 2-1 のアプリケーションと同等のアプレットのソースです。


例 2-2 Java アプレット

//
// HelloWorld Applet
//
import java.awt.Graphics;
import java.applet.Applet;

public class HelloWorld extends Applet {
	public void paint (Graphics g) {
		g.drawstring ("Hello World", 25, 25);
	}
}

アプレットでは、参照されているすべてのクラスを明示的に取り込ま (import) なければなりません。キーワード publicvoid は、アプリケーションの場合と同じことを意味しています。extends は、HelloWorld クラスが Applet クラスから継承することを示しています。

アプレットは、次のようにコンパイルします。


$ javac HelloWorld.java

アプレットは、HTML コードによってブラウザで呼び出されます。アプレットを実行するための最小限の HTML ページは次のとおりです。


<title>Test</title>
<hr>
<applet code="HelloWorld.class" width=100 height=50>
</applet>
<hr>

javald と再配置可能アプリケーション

Java アプリケーションを正しく実行するには、JAVA_HOMECLASSPATH、および LD_LIBRARY_PATH 環境変数を正しく設定する必要があります。これらの環境変数の値は、各ユーザによって制御されるため、パスが通常とは異なるように任意のパスに設定できます。また、通常、アプリケーションは CLASSPATH 変数に独自の値が必要です。

javald(1) は、Java アプリケーションのためのラッパーを生成するコマンドです。ラッパーは、JAVA_HOMECLASSPATH、および LD_LIBRARY_PATH 環境変数のいずれか、またはすべての正しいパスを指定できます。パスを指定しても、これらの環境変数のユーザの値には影響しません。Java アプリケーションの実行中は、これらの環境変数のユーザの値を無効にします。さらにラッパーは、Java アプリケーションが実際に実行されるまで指定されたパスが結合されないことを保証するので、アプリケーションの再配置性が最大になります。

Solaris 上での Java スレッド

Java プログラミング言語は、マルチスレッド化されたプログラムのサポートを想定しています。すべての Java インタプリタは、マルチスレッド化されたプログラミング環境を提供しています。しかし、これらのインタプリタの多くは、マルチスレッドの単一プロセッサ形式しかサポートしていません。そのため、マルチプロセッサ上で実行する従来の Java インタプリタでの Java プログラムのスレッドは、完全に並行には実行されず、実際には一度に 1 つのスレッドしか実行していません。

Solaris Java VM インタプリタは、複数プロセッサのコンピューティングシステムをすべて利用しています。このインタプリタは、単一プロセスの複数スレッドを複数の CPU に同時にスケジュールできるイントリンシクス Solaris マルチスレッド機能を使用します。このため、マルチスレッド化された Java プログラムは、Solaris Java VM の元で実行すると、その並行性の程度が著しく向上します。

図 2-1 は、Java スレッドが Solaris Java VM の元でどのように動作するかを示しています。Solaris スレッドの動作については、『マルチスレッドのプログラミング』を参照してください。

図 2-1 Solaris 上での Java スレッド

Graphic

マルチスレッド化されたアプリケーションのチューニング

並行化されたマトリックス乗算などの計算のアプリケーションなどで、Solaris スレッドを十分に活用するには、Solaris のネイティブ関数 thr_setconcurrency(3T) を使用します。これにより Solaris 本来のマルチスレッド機能が Java アプリケーションで使用でき、複数プロセッサを完全に利用することが保証されます。これは、ほとんどの Java アプリケーションおよびアプレットには必要ありません。次のコードは、これをどのように行うかの例です。

最初の要素は、MPtest_NativeTSetconc() を使用する Java アプリケーション MPtest.java です。このアプリケーションは 10 個のスレッドを生成し、各スレッドは識別行を表示してから 10,000,000 回ループし、計算の多い活動のシミュレーションを行います。


例 2-3 MPtest.java

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 です。


例 2-4 NativeThreads.c

#include <thread.h>
#include <unistd.h>

void MPtest_NativeTSetconc(void *this) {
		thr_setconcurrency(sysconf(_SC_NPROCESSORS_ONLN));
}

最後に、4 つのファイルを Java アプリケーション MPtest.class に結合するには、次のような makefile を使用して非常に簡単に実行できます。


例 2-5 MPtest の makefile

# make は、2 つのステージで行わなければならない。
# まず、"make MPtest" を実行する。
# 次に、NativeThreads.c を作成してネイティブ関数
# "thr_setconcurrency(sysconf(_SC_NPROCESSORS_ONLN))
# の呼び出しを組み込んでから "make lib" を実行する。
# その後、LD_LIBRARY_PATH および CLASSPATH を "." に
# 設定して "java MPtest" を実行できる。

JH_INC1=/usr/java/include
JH_INC2=/usr/java/include/solaris
CLASSPATH=.; export CLASSPATH

MPtest:
	javac MPtest.java
	(CLASSPATH=.; export CLASSPATH; javah MPtest)
	(CLASSPATH=.; export CLASSPATH; javah -stubs MPtest)
	cc -G -I${JH_INC1} -I${JH_INC2} MPtest.c NativeThreads.c ¥
		-o libNativeThreads.so
clean:
	rm -rf *.class MPtest.c MPtest.o libNativeThreads.so ¥
		NativeThreads.o *.h


Java WorkShop とは

Java WorkShop (JWS) は、SunSoft DevPro の別パッケージ製品です。JWS は Java で実装されており、独自の Java インタプリタを使用します。JWS は、Portfolio Manager、Project Manager、Source Editor、Build Manager、Source Browser、Debugger、Project Tester、オンラインヘルプ、および Visual Java の 9 個のアプリケーションから構成されています。

Portfolio Manager 

Java プロジェクトのポートフォリオの作成とカスタマイズを行う。このアプリケーションは、新しいアプレットとアプリケーションを作成する元となるオブジェクトとアプレットの集合を管理する。 

Project Manager 

プロジェクトの設定を変更し、ディレクトリを設定する。コンポーネントへのパスの位置と設定の編成と保存を行う。 

Source Editor 

ソースコードの作成と編集を行うためのポイント&クリックツール。Java WorkShop のコンポーネントは、プロセスの作成、コンパイル、およびデバッグで頻繁に Source Editor を呼び出す。 

Build Manager 

Java ソースコードを Java バイトコードにコンパイルし、ソースにあるエラーを見つける。Source Editor を起動すると、Build Manager はソースコードの訂正箇所にリンクするので、訂正やコンパイルを非常に素早く実行できる。 

Source Browser 

プロジェクトにあるすべてのオブジェクトのクラス継承を示すツリーダイアグラムを表示する。また、プロジェクトにあるすべてのコンストラクタと通常のメソッドをリストし、文字列とシンボルを検索できるようにする。Source Browser は、Source Editor にリンクしてコードを表示する。 

Debugger 

デバッグプロセスの制御と管理を行うためのツール群を提供する。コントロールパネルの元でアプリケーションまたはアプレットを実行すると、スレッドの停止と再開、ブレークポイントの設定、例外のトラップ、スレッドのアルファベット順表示、およびメッセージの参照を行うことができる。 

Project Tester 

アプレットビューワと同様に、Project Tester を使用して、アプレットの実行とテストを行うことができる。Build Manager を使用してアプレットをコンパイルしてから、Project Tester を使用して実行する。 

オンラインヘルプ 

「目次」、「索引」、「チュートリアル」、「プロジェクトの管理」、「ソースコードの編集」、「プロジェクトの構築」「Visual Java」、「ソースの表示」、および「プロジェクトのデバッグ」で構成されている。 

Visual Java 

カスタマイズ可能なプレビルト GUI 画像ウィジェトのパレットがあるポイント&クリックインタフェースを持つ統合 Java GUI ビルダ