Groovy исполнитель параллелизма, ожидающий завершения как метод объединения в потоках - PullRequest
1 голос
/ 16 февраля 2012

я пробовал это с pool.shutdown () и pool.awaitTermination (0, TimeUnit.SECONDS), но он действительно не хочет ждать выполнения задач, прежде чем он напечатает меня, что он закончил. Что я делаю неправильно. Кстати: сам бассейн - лучшее, что я видел для многозадачности до сегодняшнего дня. Рад, что нашел это здесь !!! Решение с такими сигналами, как CountDownLatch, похоже, не самый удачный способ ... Я ищу что-то вроде метода соединения, так как он реализован для потоков.

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 ]

4 голосов
/ 16 февраля 2012

Попробуйте использовать 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()
4 голосов
/ 16 февраля 2012

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

pool.awaitTermination( Long.MAX_VALUE, TimeUnit.NANOSECONDS )
1 голос
/ 16 февраля 2012

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

pool.awaitTermination(1, TimeUnit.MINUTES);

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

Edit:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...