付録B.1 スレッド生成処理一覧

ここでは,次のAPIや機能がJavaVM内部で生成するスレッドについて説明します。

<この項の構成>
(1) GUI関連のAPI
(2) JMX関連のAPI
(3) JNDI関連のAPI
(4) RMI関連のAPI
(5) そのほかのAPIや機能

(1) GUI関連のAPI

GUI関連のAPIで,次のスレッドを生成します。

特定の条件なし
AWTまたはSwingのGUI機能を使用すると,スレッドを生成することがあります。生成するスレッドはJavaプロセスで最大六つです。
java.awt.EventQueueクラス
EventQueueインスタンスごとに,一つのスレッドを生成することがあります。
java.awt.FileDialogクラス
show()メソッドを呼び出すと,スレッドを一つ生成します。この呼び出しによるスレッドはFileDialogインスタンスごとに最大一つです。
java.awt.image.renderable.RenderableImageProducerクラス
startProduction()メソッドを呼び出すとスレッドを一つ生成します。
java.awt.print.PrinterJobクラス
次のメソッドを呼び出すと,スレッドを一つ生成します。
  • print()(2種両方)
  • printDialog()(2種両方)
  • pageDialog()(2種両方)
java.awt.TrayIconクラス
UNIX環境でjava.awt.TrayIconインスタンスを生成すると,インスタンスごとに,一つのスレッドを生成します。
javax.swing.JEditorPaneクラス
JEditorPaneインスタンスごとに,一つのスレッドを生成することがあります。
javax.swing.JFileChooserクラス
javax.swing.JFileChooserインスタンスごとに,一つのスレッドを生成することがあります。
javax.swing.JTableクラス
print()(5種類すべて)を呼び出すと,スレッドを一つ生成します。
javax.swing.Timer
start()またはrestart()メソッドを呼び出すと,スレッドを一つ生成します。この呼び出しによるスレッドはTimerインスタンスごとに最大一つです。
javax.swing.text.LayoutQueueクラス
addTask()メソッドを呼び出すと,スレッドを一つ生成します。この呼び出しによるスレッドはLayoutQueueインスタンスごとに最大一つです。
javax.swing.text.JTextComponentクラス
print()(3種類すべて)を呼び出すと,スレッドを一つ生成することがあります。
javax.swing.text.AsyncBoxViewクラス
次のメソッドを呼び出すと,API内部でLayoutQueueインスタンスを作成し,その延長でスレッドを生成することがあります。
  • preferenceChanged()
  • replace()
  • setSize()
javax.swing.text.html.FormViewクラス
submitData()メソッドを呼び出すと,スレッドを一つ生成します。
Appletの使用
UNIX環境でAppletを使用して警告アイコンが表示されると,スレッドを一つ生成します。
インプットメソッドの使用
java.awt.imやjava.awt.im.spiで提供されるインプットメソッドを使用するとスレッドを生成することがあります。このスレッドはJavaプロセスで最大一つです。

(2) JMX関連のAPI

JMX関連のAPIで,次のスレッドを生成します。

SNMP(Simple Network Management Protocol)によるリソース監視
SNMPを使用してリソースを監視・管理している場合,最大で九つのスレッドを生成します。
javax.management.remote.rmi. RMIConnectionインターフェース
RMIConnectionインターフェースを実装したクラスのインスタンスごとに,一つのスレッドを生成することがあります。
javax.management.remote.rmi.RMIConnectorクラス
connect()(2種両方)メソッドを呼び出すと,確立した接続一つごとにスレッドを二つ生成します。

(3) JNDI関連のAPI

JNDI関連のAPIで,次のスレッドを生成します。

特定の条件なし
ネーミングやディレクトリの操作で,JNDIコンテキスト一つごとにスレッドを二つ生成します。
javax.naming.event.EventContextインターフェース
EventContextインターフェースを実装したクラスのaddNamingListene()(2種両方)メソッドを呼び出すと,一つのスレッドを生成することがあります。この呼び出しによるスレッドはディレクトリコンテキストごとに最大一つです。

(4) RMI関連のAPI

RMI関連のAPIで,次のスレッドを生成します。

RMIサーバ側
JavaVM内部で次のスレッドを生成します。
  • 特定の条件なしに最大六つのスレッドを生成します。このスレッドはJavaVMプロセスの終了まで維持されます。
  • RMIクライアントから接続待機向けに,リモートオブジェクトをエクスポートしたTCPポート数分のスレッドを生成します。
  • RMIクライアントからのメソッド呼び出しがあると,その制御のため一つのスレッドを生成します。
  • java.rmi.server.Unreferencedインターフェースを実装したリモートオブジェクトのunreferenced()メソッド呼び出し向けに,一つのスレッドを生成します。
RMIクライアント側
接続しているRMIサーバと同数のスレッドを生成します。

(5) そのほかのAPIや機能

そのほかのAPIや機能で,次のスレッドを生成します。

HTTP/HTTPS通信
HTTP/HTTPS通信をするとKeep Aliveの制御のためスレッドを二つ生成します。このスレッドはJavaプロセスで最大二つです。
DNS通信
Windows環境でDNS通信をすると,スレッドを一つ生成することがあります。このスレッドはJavaプロセスで最大一つです。
ファイナライザの明示実行
java.lang.Systemクラスやjava.lang.RuntimeクラスのrunFinalization()を呼び出すとスレッドを一つ生成します。
外部プロセスの作成
UNIX環境でjava.lang.ProcessBuilderクラスなどによって外部プロセスを作成すると,スレッドを一つ生成します。このスレッドはjava.lang.Processインスタンスごとに最大一つです。
java.nio.channels.Selectorクラス
Windows環境でSelectorクラスを使用すると,Selectorインスタンスへのチャネルの登録数が1,024増えるごとに,スレッドを一つ生成します。
java.util.prefs.Preferencesクラス
Preferencesクラスを使用すると,スレッドを一つ生成することがあります。このスレッドはJavaプロセスで最大一つです。
javax.print.PrintServiceLookupクラス
javax.print.PrintServiceLookupを使用すると,スレッドを一つ生成します。このスレッドはJavaプロセスで最大一つです。
sun.security.pkcs11.SunPKCS11クラス
sun.security.pkcs11.SunPKCS11インスタンスごとに,スレッドを一つ生成することがあります。