トップ     差分 バックアップ   リロード     一覧 単語検索 最終更新
  • Profile
  • Java
    • Java Tips
    • Eclipse, XML
  • Softwares
  • サーバ関係
    • PukiWiki
  • Links

最新の20件
2022-09-03
  • AutoTicketLinkName
2014-10-31
  • PukiWiki/1.4
  • PukiWiki/1.4/Manual
  • Help
  • FormattingRules
  • server/サーバの仕様
2009-02-27
  • FrontPage
2008-09-16
  • links/よく使うツール
  • Profile
2008-08-07
  • gentoo/lvm2+raid1
2006-12-16
  • gentoo/linux-igd
2006-11-23
  • gentoo/PPPoEの設定
  • gentoo
2005-09-14
  • InterWikiName
  • SandBox
2005-04-15
  • MenuBar
2005-04-08
  • links/巡回先
2005-04-07
  • Java/XML/rngomでXMLSchemaのDatatypeLibraryを使う
2005-04-06
  • Java/Tips/Javaで,子プロセスを使うときの注意点
2005-03-26
  • Java/Eclipse/Lomboz J2EE Plugin から,Tomcat 5.0を起動する

(edit)

Java Tips

Javaで,子プロセスを使うときの注意点†

Javaでは,java.lang.Runtime#exec(...) を使うことで,子プロセスを起動し,外部のプログラムを実行できます.

しかし,このメソッドは,使い方を誤るとリソースリークを引き起こします.

exec() は,戻り値として,java.lang.Process を返します.

Process には,以下の5つのメソッドがあります.

  • void destroy()
    • サブプロセスを終了します。
  • int exitValue()
    • サブプロセスの終了コードを返します。
  • InputStream getErrorStream()
    • サブプロセスのエラーストリームを取得します。
  • InputStream getInputStream()
    • サブプロセスの入力ストリームを取得します。
  • OutputStream getOutputStream()
    • サブプロセスの出力ストリームを取得します。
  • int waitFor()
    • 必要な場合に、この Process オブジェクトが表すプロセスが終了するまで現在のスレッドを待機させます。

問題となるのは,getErrorStream, getInputStream, getOutputStream の3つです. これらは,それぞれ,InputStreamとOutputStream を返し,子プロセスの標準入出力と標準エラー出力を読み書き出来ます.

標準入出力や標準エラー出力にアクセスしなければ用がないのですが,用がない場合でも,明示的にすべてのストリームをcloseしてやらないと,ファイルディスクリプタを解放せず,保持し続けます.

数回実行する程度なら問題が表面化しませんが,繰り返し実行すると,最後にはファイルディスクリプタが足りなくなり,"Too many open files"というメッセージとともに,例外が発生し,ファイルが開けなくなります.

子プロセス呼び出し後は,必ず,ストリームを閉じなければなりません.

例えば,次のようになります.

Process process = null;
try {
    process = Runtime.getRuntime().exec("someone_command");
    process.waitFor();
}
finally {
    if(process != null) {
        process.getErrorStream().close();
        process.getInputStream().close();
        process.getOutputStream().close();
        process.destroy();
    }
}
トップ   編集 差分 バックアップ リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-04-06 (水) 13:33:47
Link: Java Tips
Site admin: shingo

PukiWiki 1.5.4 © 2001-2022 PukiWiki Development Team. Powered by PHP 8.1.20. HTML convert time: 0.005 sec.