まず、Java 5 以降を使用している場合は、代わりにProcessBuilderRuntime.getRuntime().exec()を使用することをお勧めします。まず、引数の引用について心配する必要はありません。個別のコマンドライン引数はそれぞれ個別のパラメーターです。例えば:
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/C", "java net/com/codeusa/Server 43594");
Process process = builder.start();
ProcessBuilder または を使用してプロセスを開始する場合Runtime.getRuntime().exec()、選択した Process のサブクラスをインスタンス化して返すのは完全に JVM 次第であり、その決定に影響を与える方法はありません。あなたの ProcessHandler クラスはあなた自身が書いたものだと思います (その名前の Java API クラスは見つかりません)。Process をサブクラス化する可能性がありますが、その場合でも、ProcessBuilder またはRuntime.getRuntime().exec(). したがって、上記のコード行は、他の例外をスローしないと仮定して、ClassCastException をスローすることが保証されています。
メソッドに応答しないプロセスの過去の経験がいくつかありdestroy()ます。通常、これは、プロセスによって書き込まれる標準出力または標準エラーが読み取られず、1 つ以上の I/O バッファーがいっぱいになったためにプロセスが停止したことが原因でした。上記のプロセスは、標準出力または標準エラーに何かを書き込みますか? もしそうなら、それを読んでいますか?
ProcessBuilder を使用すると、標準出力と標準エラー ストリームの両方を簡単に読み取ることができbuilder.redirectErrorStream(true);ます。上記の 2 行の間に次の行を追加すると、プロセスの標準出力から読み取るだけで済みます。Java 1.4 以前とRuntime.getRuntime().exec()に行き詰まっている場合は、2 つの異なるスレッドで 2 つの異なるオブジェクトを設定する必要があります。1 つは各ストリームから読み取ります。
ProcessHandler クラスで何を達成しようとしているのかわかりません。ソースコードを提供していません。destroy()その上、メソッドを使用するよりも強制的にプロセスを強制終了する必要があったことはありません。