J'essaye d'écrire un composant réutilisable dans Groovy pour tirer facilement des emails de certaines de nos applications Java. Je voudrais passer une liste, où Email est juste un POJO (POGO?) Avec quelques informations par email. Je voudrais qu'il soit multithread, au moins en exécutant toute la logique d'email dans un deuxième fil, ou fais un fil par email.Comment paralléliser ce code groovy?
Je suis vraiment brumeux sur le multithreading en Java, donc ça n'aide probablement pas! Je l'ai essayé quelques différentes façons, 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'espérais que le sommeil serait au hasard lent certains fils vers le bas de sorte que la sortie de la console ne serait pas séquentiel. 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 essentiellement ce que vous attendez, y compris la déclaration println, et le client qui appelle cette suite,
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
}
Merci Don, cela aide. J'ai remplacé l'exécution et la jointure avec threadExecutor.execute à la place, puis threadExecutor.shutdown(), et enfin threadExecutor.awaitTermination (1, TimeUnit.MINUTES) car je pense qu'il était prématurément en train de quitter et de tuer les threads générés. On dirait que je suis en train de courir maintenant. – lucas
COOL! Content que cela ait aidé. –