2011-02-04 13 views
1

私はいくつかのスレッドをほぼ無限の時間と繰り返し回数実行しています。最適解が見つかった場合、反復回数は0にリセットされます。無限ループを防止するために、反復の最大回数が設定されます。CountdownLatchはawait(maxTime)とcountdown()を結合します。

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

注:スレッドはFixedThreadPool ExecutorService内で実行されています。

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のをshutdownNowのことができるように、すべてのスレッドが停止していることを意味していることを知っています。

最大時間に達してもそうではありません。だから(1)私は文明的な方法でそれらを終了するためにすべての私のランナーを繰り返すことを望みます:-)。そのために、私は関数putTermination()を定義しました。これは、単純にput、iterationCounterを私のrunnablesのMaxIterationCountに設定します。

だから、(1)今

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

になる、私はうーむちょうど私が、追加のラッチと仕事を持っている可能性があることを考えて....私は進むことができます前に、すべてのスレッドが実際に停止されるまで再び待機する必要がありそれと。

だから、(2)もちろん

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

、私の機能notifyThreadStop()はそれを修正する必要があるだろうになるとしてmylatch2上)(カウントダウンを行うには、それを伝えるのフラグが必要になりますマイラッチに反対する。

私はちょうど私の質問に答えたと思いますが、これはすべて書かれているので、私はここでそれを参照するために他の人に任せます。

今質問はになります。 (1)または(2)のshutdownNow()が唯一必要なのでしょうか? 私のスレッドは自分のログファイルを閉じ、内部のCallableスレッド* ss *を終了して終了する必要があることを知っています。

答えて

0

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

割り込みを受けたときにタスクを相互補完してすべてのリソースを正しく閉じることができれば、問題はないはずです。 (問題がある場合、これはあなたが修正する必要があり、あなたのタスクコードのバグです)

+0

[OK]を、[http://www.ibm.com/developerworks/java/library/j-jtp05236.html](http://www.ibm.com/developerworks/java/library/j -jtp05236.html)私はそれを得たと思う。私は基本的に私のメソッド* requestTermination()*でホイールを再発明していました。私はこれを私のスレッドを閉じる手作業で保つつもりです。それでも私のコードの別の部分でそれが必要です。 – Bastan

0

私はこのすべてが

を書かれているので、私はちょうどあなたがした私の質問に答えたがいると思いますが、確かに:-)追加するべきことが1つあるならば、RuntimeExceptionsに注意する必要があります。それ以外の場合は、shutdownNow()が呼び出されないことがあります。しかし、あなたは既にそれを知っていましたよね?

+0

もちろんもちろん;-) – Bastan

関連する問題