Trouble 14: プロセスに関する問題
<Q14-1>Runtime.exec()で起動したJavaアプリケーションがしばらくして停止してしまいます。
| <発生環境> |
| OS |
Win98OSR2 |
| JDK |
JDK1.3.0 |
| Vender |
Sun |
- <A14-1>
- Runtime.exec()で起動された子プロセスが標準出力に出力を行っているためです。
親-子関係になったVM間のバッファサイズは1024バイトであり、それ以降を出力しようとするとブロックし、子プロセスの動作が停止してしまいます。
そのため、子プロセスは標準出力に表示しないか、もしくは親プロセスでVM間のバッファのストリームを読み捨てる必要があります。
<Q14-2>java.lang.Runtime.exec()を複数回呼ぶと、execが立ち上げたスレッドが無限ループに入ることがあります。2回で起きることもあるし、100回以上ループする場合もあります。
しかし、Windows2000上では1000回ループさせても問題はありませんでした。
| <発生環境> |
| OS |
Red Hat Linux 6.2 |
| JDK |
JDK1.3β |
| Vender |
IBM |
- <A14-2>
- SunのVMに変更し、execを使用するのは1つのVMにつき1回のみとすることで、解決できます。
<Q14-3>start コマンドを使用して複数の Java プログラムを起動するバッチファイルを作成しましたが、コマンドプロンプトウィンドウが複数開いてしまいます。コマンドプロンプトウィンドウを開かずに起動する方法はありますか?
バッチファイルの内容
start java myclass1
start java myclass2
| <発生環境> |
| OS |
Windows2000/XP |
| JDK |
JDK1.4.1 |
| Vender |
Sun |
- <A14-3>
- 以下のように、start コマンドの /b オプションを使用することで、新しいウィンドウを開かずにアプリケーションを実行することができます。startコマンドの詳細については Windows ヘルプを参照してください。
start /b java myclass1
start /b java myclass2
また、java コマンドの代わりに javaw コマンドを使用しても同様の効果を得ることができます。
start javaw myclass1
start javaw myclass2
javaw コマンドに関してはこちらを参照して下さい。
http://java.sun.com/j2se/1.4/ja/docs/ja/tooldocs/win32/java.html
注意:本文書の内容に誤りがあり、またこの文書によって不利益を被っても、
エスエムジー株式会社は一切関知いたしません。