0

そのため、実行中のプロセスに問題があり、process.destroy() を使用してプロセスを停止しようとすると、停止しません。

Process を拡張するファイル (ProcessHandler) を作成し、次のことを行います。

ProcessHandler process = (ProcessHandler)Runtime.getRuntime().exec("cmd.exe /c \"java net/com/codeusa/Server 43594\"");

したがって、私の問題は、 Process を ProcessHandler に変換して、 destroy() コマンドをオーバーライドして TSKILL 自体にすることです。すべてを行う方法を理解しましたが、上記のようなコードを試すと、ClassCastException が発生します。

これらを互換性を持たせる方法を知っている人は誰でもいます。ところで、exec(String) コマンドは Process のインスタンスを返します。

4

2 に答える 2

0

まず、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()その上、メソッドを使用するよりも強制的にプロセスを強制終了する必要があったことはありません。

于 2010-09-12T09:23:52.747 に答える
0

全く新しいことを思いつきました!! プロセスの destroy() メソッドを呼び出すと、cmd.exe プロセスが破棄されます..しかし、cmd.exe を「java」に置き換えたので、destroy() を呼び出すと、java.exe プロセスが終了します..HURAY

于 2010-09-13T09:44:57.350 に答える