1

ほぼ無限の時間と反復回数で複数のスレッドを実行しています。最良の解決策が見つかった場合、反復回数は0にリセットされます。無限ループを防ぐために、最大反復回数が設定されます。

カウントダウンラッチを使用して、すべてのスレッドが最大反復回数に達したときにプロセスを停止します。つまり、スレッドが最大反復回数に達すると、 notifyThreadStop()を使用してメインスレッドに通知します。これにより、すべてのスレッドが停止すると、countdown()がトリガーされます。

注:私のスレッドはFixedThreadPoolExecutorService内で実行されています。

maxTimeラッチを追加したいと思います。だから私がしたことは次のとおりです

List<Runnable> r = .... //(contains all my runnables)
myExecutorService.invokeAll(r);

if(maxtime > 0){
    mylatch.await(maxTime,TimeUnit.Seconds);
    (1)
    do stuff...
    exit;
}
else{
    mylatch.await();
    myExecutorService.shutdownNow();
    do stuff...
    exit;
}

これで、カウントダウンによってラッチがトリガーされた場合は、すべてのスレッドが停止しているため、ExecutorServiceをシャットダウンできることがわかりました。

最大時間に達した場合はそうではありません。したがって、(1)では、すべてのランナーを繰り返し処理して、文明的な方法でランナーを終了させたいと思います:-)。そのために、私は関数requestTermination()を定義しました。これは、簡単に言えば、runnablesでiterationCounterをMaxIterationCountに設定します。

したがって、(1)は

    for(Runnable runner: r){
        if(r.getIsRunning()){r.requestTermination();}
    }
    (2)

さて、先に進む前に、すべてのスレッドが実際に停止するまでもう一度待つ必要があります。

したがって、(2)は

    mylatch2.await();
    myExecutorService.shutdownNow();

もちろん、私の関数notifyThreadStop()はそれを変更する必要があり、mylatchではなくmylatch2でcountdown()を実行するように指示するフラグが必要になります。

質問に答えたばかりだと思いますが、これがすべて書かれているので、他の人が参照できるようにここに残しておきます。

問題は次のようになります:これを処理するためのより良い方法はありますか?(1)または(2)のshutdownNow()だけが必要ですか?私のスレッドは、終了する前に、自分のログファイルを閉じて、内側のCallableスレッド*ss*をシャットダウンする必要があることを知っています。

4

2 に答える 2

0

shutdownNow()とawaitTernimation()を使用すると、実行中のすべてのタスクが中断され、タスクが終了するのを待ちます。

タスクが中断され、中断時にすべてのリソースを正しく閉じることができれば、問題は発生しません。(問題がある場合、これはタスクコードのバグであり、修正する必要があります)

于 2011-02-04T14:20:28.863 に答える
0

私はちょうど私の質問に答えたと思いますが、これはすべて書かれているので

確かにそうしました:-)追加することが1つある場合は、RuntimeExceptionsに注意する必要があります。そうしないと、shutdownNow()が呼び出されない可能性があります。しかし、あなたはそれをすでに知っていましたね?

于 2011-02-04T14:20:39.717 に答える