2012-02-15 1 views
1

Я попробовал это с pool.shutdown() и pool.awaitTermination (0, TimeUnit.SECONDS), но он действительно не хочет ждать выполнения задач, прежде чем он меня отпечатает что он закончил. Что я делаю не так. Кстати: сам пул - это лучшее, что я видел для многозадачности до сегодняшнего дня. Рад, что я нашел его здесь !!! Решение с такими сигналами, как CountDownLatch, похоже, не является самым лучшим способом ... Я ищу больше для чего-то вроде метода join, поскольку он реализован для Threads.Groovy concurrency executor ожидает завершения, как метод 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!' 

ответ

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

Наличие ваших объектов Threads не служит никакой полезной цели, я бы попросил их просто реализовать Runnable. Это не такая уж большая сделка, поскольку вы не запускаете нить, но у нее есть накладные расходы. –

1

Ожидается, что задачи завершатся. Вы должны дождаться значительного количества времени, возможно, 10 секунд? или 1 минута?

pool.awaitTermination(1, TimeUnit.MINUTES); 

Просто FYI awaitTerminiation будет ждать в течение заданного промежутка времени, если все в настоящее время в очереди элементов полной. Если они завершат метод будет выйти, и вы получите на свой println заявление

Edit:

Просто заметил, вы подаете темы на службу исполнителя. Вы должны отправлять только Runnables. Предоставлено это компиляция, потому что Thread реализует Runnable, что на самом деле происходит, является потоком службы-исполнителя, который запускает Runnable (здесь ваш поток) из рабочей очереди и выполняет свой метод run(). Следовательно, нет необходимости в передаче нити.

4

Я считаю, что ждать «навсегда» вам нужно передать магические параметры:

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