Groovy并发执行程序等待终止,如线程中的join方法

时间:2012-02-15 23:27:46

标签: groovy concurrency terminate executorservice

我尝试使用pool.shutdown()和pool.awaitTermination(0,TimeUnit.SECONDS),但它确实不想等待任务完成,然后才打印出它已经完成的任务。我究竟做错了什么。顺便说一句:游泳池本身是我看到的多任务直到今天最好的东西。很高兴我在这里找到了!!!像CountDownLatch这样的信号解决方案似乎并不是最流行的方式......我正在寻找类似于为Threads实现的join方法的东西。

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!'

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:4)

我相信等待'永远'你需要传递魔法参数:

pool.awaitTermination( Long.MAX_VALUE, TimeUnit.NANOSECONDS )

答案 2 :(得分:1)

您正在等待0秒才能完成任务。你应该等待一段有意义的时间,也许是10秒钟?还是1分钟?

pool.awaitTermination(1, TimeUnit.MINUTES);

只是一个FYI,awaitTerminiation将等待指定的时间,除非所有当前排队的项目都已完成。如果他们完成,该方法将退出,您将转到println声明

编辑:

注意到你正在向执行者服务提交线程。您应该只提交Runnables。当然,它正在编译,因为Thread实现Runnable实际发生的是执行器服务的线程将Runnable(这里是您的线程)从工作队列中取出并执行其run()方法。因此不需要提交Thread。