Comment paralléliser cette groovy code?

Je suis en train d'écrire un composant réutilisable en Groovy facilement tirer des e-mails à partir de certaines de nos applications Java. Je voudrais passer une Liste, où l'Email est juste un POJO(POGO?) avec certains e-mail info. J'aimerais qu'il soit multithread, au moins l'exécution de tous les e-mails de la logique dans un deuxième thread, ou de faire un thread par e-mail.

Je suis vraiment brumeux sur le multithreading en Java, de sorte que probablement n'aide pas! J'ai tenté un peu de façons différentes, mais voici ce que j'ai en ce moment:

void sendEmails(List<Email> emails) {
def threads = []
def sendEm = emails.each{ email ->
def th = new Thread({
Random rand = new Random()
def wait = (long)(rand.nextDouble() * 1000)
println "in closure"
this.sleep wait
sendEmail(email)
})
println "putting thread in list"
threads << th
}
threads.each { it.run() }
threads.each { it.join() }
}

J'ai été en espérant que le sommeil serait aléatoire de lent à certains threads, donc la sortie de la console ne serait pas séquentielle. Au lieu de cela, je vois ceci:

putting thread in list
putting thread in list
putting thread in list
putting thread in list
putting thread in list
putting thread in list
putting thread in list
putting thread in list
putting thread in list
putting thread in list
in closure
sending email1
in closure
sending email2
in closure
sending email3
in closure
sending email4
in closure
sending email5
in closure
sending email6
in closure
sending email7
in closure
sending email8
in closure
sending email9
in closure
sending email10

sendEmail fait ce que vous attendez, y compris la println déclaration, et le client qui appelle ce qui suit,

void doSomething() {
Mailman emailer = MailmanFactory.getExchangeEmailer()
def to = ["one","two"]
def from = "noreply"
def li = []
def email   
(1..10).each {
email = new Email(to,null,from,"email"+it,"hello")
li << email
}
emailer.sendEmails li
}

OriginalL'auteur lucas | 2010-05-26