9

Java には、特定の方法でテキスト ファイルを処理する関数があります。ただし、時間がかかりすぎると、そのテキスト ファイルのプロセスは (理由が何であれ) 役に立たない可能性が高く、スキップしたいと思います。さらに、プロセスに時間がかかりすぎると、メモリも大量に使用されます。この方法で解決しようとしましたが、うまくいきません:

for (int i = 0; i<docs.size(); i++){
    try{
        docs.get(i).getAnaphora();
        }
    catch (Exception e){
        System.err.println(e);
    }
 }

ディレクトリ内のファイルの場所docsです。List通常、コードは特定のファイルで「スタック」しているため (そのファイルの内容によって異なります)、手動でコードを停止する必要があります。

その関数呼び出しの時間を測定し、関数が 10 秒以上かかるファイルをスキップするように Java に指示する方法はありますか?

EDIT
いくつかの異なる答えをまとめた後、うまく機能するこのソリューションを思いつきました。おそらく、他の誰かがそのアイデアを使用することもできます。

まず、Runable を実装するクラスを作成します (この方法で、必要に応じてスレッドに引数を渡すことができます)。

public class CustomRunnable implements Runnable {

    Object argument;

    public CustomRunnable (Object argument){
        this.argument = argument;
}

    @Override
    public void run() {
        argument.doFunction();
    }
}

次に、クラスで次のコードを使用しmainて関数 ( ) の時間を監視し、時間がargument.doFunction()かかりすぎる場合は終了します。

Thread thread;
for (int i = 0; i<someObjectList.size(); i++){          
    thread = new Thread(new CustomRunnable(someObjectList.get(i)));
    thread.start();
    long endTimeMillis = System.currentTimeMillis() + 20000;
    while (thread.isAlive()) {
        if (System.currentTimeMillis() > endTimeMillis) {
        thread.stop();
        break;
    }
    try {
        System.out.println("\ttimer:"+(int)(endTimeMillis - System.currentTimeMillis())/1000+"s");
        thread.sleep(2000);
        }
    catch (InterruptedException t) {}
    }
}

私は廃止されたことに気づきstop()ましたが、スレッドを停止したいときにスレッドを停止して終了する他の方法を見つけていません。

4

3 に答える 3

9

RunnableコードをorでラップCallableし、適切な Executor に送信して実行します。submit メソッドの 1 つがタイムアウト期間を取り、その後コードが中断されます。

于 2013-04-20T14:04:38.490 に答える