1

事前定義された時間を超えた場合にプロセスを検出/強制終了する最善の方法は何だろうと思っています。古い方法は、ant パッケージの watchdog/timeoutobserver クラスを使用することでした。しかし、これは現在非推奨になっているので、どうすればよいのでしょうか。

ウォッチドッグを使用するコードは次のとおりです。

import org.apache.tools.ant.util.Watchdog;
import org.apache.tools.ant.util.TimeoutObserver;


public class executer implements TimeoutObserver {

    private int timeOut = 0;
    Process process = null;
    private boolean killedByTimeout =false;


    public executer(int to) {
        timeOut = t;
    }

    public String executeCommand() throws Exception {
        Watchdog watchDog = null;
        String templine = null;
        StringBuffer outputTrace = new StringBuffer();
        StringBuffer errorTrace = new StringBuffer();



        Runtime runtime = Runtime.getRuntime();



        try {
            //instantiate a new watch dog to kill the process
            //if exceeds beyond the time
            watchDog = new Watchdog(getTimeout());
            watchDog.addTimeoutObserver(this);
            watchDog.start();

            process = runtime.exec(command);

            //... Code to do the execution .....

            InputStream inputStream = process.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            bufferedReader = new BufferedReader(inputStreamReader);
            while (((templine = bufferedReader.readLine()) != null) && (!processWasKilledByTimeout)) {
                outputTrace.append(templine);
                outputTrace.append("\n");
            }


            this.setStandardOut(outputTrace);


            int returnCode = process.waitFor();
            //Set the return code
            this.setReturnCode(returnCode);

            if (processWasKilledByTimeout) {
                //As process was killed by timeout just throw an exception
                throw new InterruptedException("Process was killed before the waitFor was reached.");
            }


        } finally {
            // stop the watchdog as no longer needed.
            if (aWatchDog != null) {
                aWatchDog.stop();
            }
            try {
                // close buffered readers etc
            } catch Exception() {
            }
            //Destroy process
            //    Process.destroy() sends a SIGTERM to the process. The default action
            //    when SIGTERM is received is to terminate, but any process is free to
            //    ignore the signal or catch it and respond differently.
            //
            //    Also, the process started by Java might have created additional
            //    processes that don't receive the signal at all.
            if(process != null) {

                process.destroy();
            }
        }



        public void timeoutOccured(Watchdog arg0) {
            killedByTimeout = true;

            if (process != null){
                process.destroy();
            }
            arg0.stop();
        }

    }
}

私は少し迷っているので、どんな助けでも大歓迎です。これをJava 7にしようとしていますが、割り当てられた時間を超えてハングした場合にそれを殺す最善の方法については最新ではありません.

ありがとう、

4

4 に答える 4

0

それ自体が非推奨であることだけに関心がある場合は、 を使用して、しばらくしてから実行WatchDogすることはそれほど難しくありません。TimerTaskprocess.destroy()

于 2013-04-09T10:41:12.203 に答える
0

理論的stop()には、スレッドにはスレッドを完全に殺すメソッドがあります。このメソッドは、リソース リークを引き起こす可能性があるため、Java 1.1 以降では推奨されていません。したがって、実際に使用することはお勧めしません。

「正しい」解決策は、特別な「シグナル」を受信したときにスレッドが正常に終了できるようにスレッドを実装することです。「中断」メカニズムを使用できます。ウォッチドッグは、時間制限を超えたスレッドの「interrupt()」を呼び出す必要があります。ただし、スレッドはisInterrupted()自分自身を呼び出して、中断された場合は終了する必要があります。良いニュースは、そのメソッドはこれに似sleep()ており、wait()すでにこれをサポートしているため、スレッドが待機しているときに外部から割り込みをInterruptedException行うと、スローされます。

于 2013-04-09T10:35:14.807 に答える
0

ExecutorServices一定の実行時間が与えられた後にプロセスをキャンセルする一連のプロセスを作成しました。このコードは GitHub にチェックインされています。

の作成に使用するクラスExecutorServiceCancelingExecutorsです。2 つの主要なクラスがあります。

于 2013-04-09T10:42:32.127 に答える