2012-02-15 5 views
1

これをpool.shutdown()とpool.awaitTermination(0、TimeUnit.SECONDS)で試してみましたが、実際にそれを印刷する前にタスクが完了するのを待っていますそれは終わった。私は間違って何をしていますか?ところで、プール自体は今日までマルチタスキングで見た中で最高のものです。うれしい私はここでそれを見つけた! CountDownLatchのようなシグナルを持つソリューションは、わかりやすい方法ではないようです...私は、スレッドのために実装されているように、joinメソッドのようなものを探しています。スレッドの結合メソッドのような終了を待っているGroovy同時実行エグゼキュータ

import java.util.concurrent.Executors 
import java.util.concurrent.TimeUnit 
import java.util.concurrent.atomic.AtomicInteger 
import groovy.transform.Synchronized 
import java.util.concurrent.* 


class myThread extends Thread{ 
Integer timer=0 
Integer count=0 
String tn='' 
String status='' 

    def counter = new AtomicInteger() 

    def void run() { 
     println tn+' started ---- !!! ----' 
     status='running' 
     for(i in 1..count) { 
      sleep timer 
      println tn+" Doing something loop $i" 
      counter.incrementAndGet() 
     } 
     println tn+' finished - ### -' 
     status='ok' 
     this.join() 
    } 

} 

def queue=[] 

def mt1=new myThread(timer:550,count:10,tn:'t1',status:'') 
def mt2=new myThread(timer:530,count:6,tn:'t2',status:'') 
def mt3=new myThread(timer:550,count:10,tn:'t3',status:'') 
def mt4=new myThread(timer:500,count:6,tn:'t4',status:'') 

queue.push(mt1) 
queue.push(mt2) 
queue.push(mt3) 
queue.push(mt4) 


def maxConcurrent=2 
def pool = Executors.newFixedThreadPool(maxConcurrent) 
queue.each(){ 
    pool.submit(it) 
} 

pool.shutdown() 
pool.awaitTermination(0, TimeUnit.SECONDS); 

// HOW DO I WAIT HERE??? 

println 'NOW its REALLY!!! finished!' 

答えて

4

は、私はあなたが魔法のパラメータ渡す必要がある「永遠」待つようにと考えていExecutorCompletionService

def pool = Executors.newFixedThreadPool(maxConcurrent) 

    def ecs = new ExecutorCompletionService<Void>(pool); 

    queue.each { 
     ecs.submit(it, Void); // I think this is how to handle a void return 
    } 

    // take blocks until task finished so get probably not needed in this case 
    queue.each { 
     ecs.take().get(); 
    } 

    pool.shutdown() 
+0

おかげで多くのことを、これはまさにソリューションであり、私の持つ素晴らしい作品スレッドを拡張します。ありがとうございました!!! – Booyeoo

+0

あなたのオブジェクトをスレッドにするのは便利な目的ではありません。代わりにRunnableを実装するだけです。あなたはスレッドを開始していないが、それはオーバーヘッドを持っているので、それほど大きな取引ではありません。 –

1

タスクが完了するまで0秒間待機しています。意味のある時間、たぶん10秒待つべきでしょうか?または1分?

pool.awaitTermination(1, TimeUnit.MINUTES); 

awaitTerminiationは、現在待機中のすべてのアイテムが完了しない限り、指定された時間だけ待機します。彼らはこの方法が終了すると、あなたのprintln声明

に取得することを完了した場合は、編集:

はちょうどあなたがエグゼキュータサービスにスレッドを提出している気づきました。あなたはRunnablesを提出する必要があります。実際に何が起こっているのかは、スレッドがExecuteサービスのスレッド(ここではあなたのスレッド)を作業キューから取り出し、そのrun()メソッドを実行するということです。したがって、スレッドが送信される必要はありません。

4

を使用してみてください:

pool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS) 
関連する問題