表 3-3 は、Java スレッド API と Solaris および POSIX スレッド API をできるかぎり対応づけたものです。Java スレッド API と Solaris スレッド API および POSIX スレッド API との完全な対応を示すものではありません。また、この表を参考にすれば、Solaris または POSIX スレッドプログラムを簡単に Java スレッドプログラムに、あるいは Java スレッドプログラムを Solaris スレッドプログラムまたは POSIX スレッドプログラムに簡単に変換できるというわけでもありません。表 3-3 は、単に API 間のおおよその対応を示すだけです。3 つの API のうちのいずれかに関する知識があり、各 API 間の対応を確認するときのガイドラインとして利用してください。C の手続き型および階層プログラミングで Solaris API を使用することと、Java のオブジェクト指向のプログラミング手法で Solaris API を使用することの間には、概念上の違いがあります。
次に、Java スレッド API と Solaris スレッド API とは完全には対応していない理由を示す例を紹介します。
表 3-3 では、Java スレッドの破壊スレッド (Destroy()) は、POSIX の pthread_cancel() に対応しています。ただし、POSIX の pthread_cancel() は、取り消し点の概念が存在し、かつ pthread_cleanup_push() と pthread_cleanup_pop() を使用して、取り消し点のあたりでクリーンアップハンドラを作成することによって初めて完全になります。Java スレッド API には、スレッドの破壊について同様の概念はありません。この意味で、これら 2 つの破壊手法はまったく異なります。
JDK 1.1 では、Destroy() メソッドは推奨されていません。
表 3-3 では、Java スレッドの interrupt() メソッドは POSIX の pthread_kill() に対応していますが、両者はまったく異なります。Java には安全な割り込み点の概念がありますが (たとえば wait())、POSIX にはそのような概念はありません。
Java には、Solaris の読み取り/書き込みロックインタフェースや POSIX の属性に相当するインタフェースはありません。
Java スレッド API |
Solaris スレッド API |
POSIX スレッド API |
---|---|---|
thr_create() | pthread_create() | |
activeCount() | ||
checkAccess() | ||
countStackFrames() | ||
currentThread() | thr_self() | pthread_self() |
destroy() | pthread_cancel() | |
dumpStack() | ||
enumerate() | ||
getName() | ||
getPriority() | thr_getprio() | pthread_ getschedparam() |
getThreadGroup() | ||
interrupt() | thr_kill() | pthread_kill() |
interrupted() | ||
isAlive() | ||
isDaemon() | ||
isInterrupted() | ||
join() | thr_join() | pthread_join() |
resume() | thr_continue() | |
run() | ||
setDaemon() |
THR_DAEMON フラグ | |
setName() | ||
setPriority() | thr_setprio() | pthread_ setschedparam() |
sleep() | sleep() | sleep() |
start() | ||
stop() | ||
suspend() | ||
同期メソッド | ||
wait() | cond_wait() | pthread_cond_wait() |
notify() | cond_signal() | pthread_cond_signal() |
synchronized メソッド synchronized 文 |
mutex_name() |
pthread_mutexe_name() |