Groovy de la simultanéité
J'ai une question à Groovy threads.
Ma tâche est de traduire chaque fichier dans un répertoire donné, d'une certaine façon
et place le résultat dans un fichier dans un autre répertoire.
J'ai écrit le code suivant qui fonctionne:
static def translateDir(fromDir, targetDir) {
def allFiles = new File(fromDir).listFiles()
def numFiles = allFiles.length
for (i in 0..(numFiles - 1))
translate(allFiles[i].getAbsolutePath(), targetDir)
}
Maintenant, j'ai essayé de paralléliser ce code comme ceci:
static def translateDir(fromDir, targetDir) {
def allFiles = new File(fromDir).listFiles()
def numFiles = allFiles.length
def numCores = Runtime.getRuntime().availableProcessors()
for (i in 0..(numCores - 1)) {
println("Thread " + i + "starting")
Thread.start {
for (def j = i; j < numFiles; j += numCores) {
println("j = " + j)
translate(allFiles[j].getAbsolutePath(), targetDir)
}
}
}
}
qui ne fonctionne pas et fournit la sortie:
Thread 0 starting
Thread 1 starting
Thread 2 starting
Thread 3 starting
nunCores est de 4, et numFiles est 3 dans mon cas de test.
Ce qui se passe ici?
OriginalL'auteur Sven Hager | 2012-05-28
Vous devez vous connecter pour publier un commentaire.
ok, 2 choses:
À l'intérieur du fil de l'implicite de la méthode run (), vous faites référence à la 'i' variable. Je dois étape à travers un débogueur pour voir exactement ce qui se passe, mais techniquement, vous ne devriez même pas avoir accès à "je", parce qu'il n'est pas finale. Donc, je te suggère de créer un Exécutable de l'objet pour lequel vous passez " je " dans le constructeur. Puis démarrer l'exécutable sur le fil.
Groovy a une grande simultanéité de soutien - aucune raison de rouler comme ça. Jetez un oeil à GPars
Merci à vous, parfois je m'ennuie de la prise en charge du compilateur ...
Vous aurez accès à
i
, il n'a pas besoin d'être en finale en Groovy, mais il est probable qu'il n'aura pas la valeur que vous avez besoinLe GPars lien nécessite une connexion.
clairement, quelqu'un y a changé quelque chose (je suppose que cela a à voir avec Groovy récente de transition. Dans l'intervalle, la source est toujours disponible à l'adresse github.com/GPars/GPars, et la documentation est dans le gpars.org/1.2.1/javadoc/index.html
OriginalL'auteur GreyBeardedGeek
Vous êtes à partir de threads, mais alors votre programme se termine avant leur exécution.
Comme il le montre dans la documentation, vous devez appeler
join
sur les fils à attendre pour eux de completIl est probablement plus facile d'utiliser l'exécuteur cadre, qui est indiquée au bas de cette même page
Modifier
Juste pour le fun, j'ai mis en place quelque chose à l'aide de
Thread.start
qu'est-ce que vous essayez d'atteindreOriginalL'auteur tim_yates