0

ランタイムのexec()メソッドをCプログラムとしてJavaで実行したいと思います。Javaコードは次のとおりです。

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command);
process.waitFor();

この場合、コンパイルされたCプログラムの実行時間をどのように定義できますか?つまり、時間間隔を設定でき、その間隔でコードの実行が終了しなかった場合、制限時間を超えたエラーを返すにはどうすればよいですか?

4

3 に答える 3

2

ここでは、マルチスレッドプログラミングの観点から考える方がよいと思います。JVMの外部でプログラムの実行を開始すると、Javaから「このプログラムの実行を停止する」ことを実際に判断することはできません...

したがって、ここで示したコードを別のスレッドで実行して、

Object.wait(long milliseconds)

このスレッドの結果を待ちます。結果が得られなかった場合は、プログラムを続行してください。

于 2012-07-03T07:21:33.047 に答える
0

(LinuxまたはPosixシステムでは)シェルulimitビルトイン( setrlimit syscallのインターフェイス)を内部で使用できますcommand。たとえば、ulimit -t 120; yourprogram and arguments内部に次のようなものを配置します。

これはCPU時間を制限するだけです。が無限にスリープしている、または一部の入力でブロックされている場合、yourprogramそれは役に立ちません。

マルチスレッドアプローチを示唆するマークの答えはおそらくより良いでしょう。しかし、私のものは本当にリソースを制限しています。

于 2012-07-03T07:22:52.260 に答える
0

達成したいことを理解するのに少し時間がかかりましたが、ここに私の提案があり
ます-A.コードスニペットを別のスレッドで実行します。たとえば、Runnableの実装は次のようになります
。publicclass ProcessExecutorimplements Runnable {

プライベート文字列コマンド。

public ProcessExecutor(String command){this.command = command; }

public void run(){ランタイムruntime = RUntime.getRuntime(); プロセスprocess=runtime.exec(command); ProcessManager.getInstance()。add(process); process.waitFor(); }}

ProcessManagerは、開発するプロセスの実行を追跡するための同期されたシングルトーンコレクションです。
これは、プロセスIDに基づくマップであり、プロセス自体、および開始時刻と最終チェック時刻に関する情報を値として保持します。実行されたプロセスのステータスを定期的にチェックするスケジュールされたタスクを実行するには、 ScheduledExecutorService
を 使用する必要があります。プロセスごとに、最後のチェック時間を管理できます。lastCheckTime-startTimeが特定の間隔を超える場合は、エラーがあることを示し、destroyメソッドを使用してプロセスを破棄する必要があります。

于 2012-07-03T07:27:42.290 に答える