J'ai un travail qui prend trop de temps en Java. Donc, je veux diviser ce travail en threads et les exécuter. Une fois que les threads ont terminé leur travail, retourne à mon service et Service leur donne de nouveaux emplois. ThreadGroup convient à cette recommandation ou à toute autre recommandation?Clustering utilisant des threads en Java
Répondre
Vérifiez la ExecutorCompletionService - il fait exactement cela.
Exemple: [tiré de Java 6 JavaDocs API]
void solve(Executor e, Collection<Callable<Result>> solvers)
throws InterruptedException, ExecutionException {
CompletionService<Result> ecs
= new ExecutorCompletionService<Result>(e);
for (Callable<Result> s : solvers)
ecs.submit(s);
int n = solvers.size();
for (int i = 0; i < n; ++i) {
Result r = ecs.take().get();
if (r != null)
use(r);
}
}
Pouvez-vous me donner un échantillon? – firstthumb
Tout d'abord, vous avez besoin des fils si:
a) Vous avez une machine multiprocesseur
ou b) Vous avez un seul processeur, mais vos travaux sont IO-intensive (et non CPU intensive
Sinon, vous ne gagnerez rien lors de l'utilisation de threads.
Qu'est-ce que vous avez besoin ici est ThreadPool
Jetez un oeil à l'emballage java.util.concurrent.
Il y a un tutoriel où vous devriez trouver tout ce que vous devez savoir ici:
http://java.sun.com/docs/books/tutorial/essential/concurrency/
Mise au point sur la High Level Concurrency Objects en particulier.
ThreadGroup
n'est généralement pas très utile pour le code d'application. Ce n'est pas non plus une grande utilité pour le code du conteneur. Le PlugIn Java utilise ThreadGroup
pour distinguer à quelle applet appartient un thread.
java.util.concurrent
, en particulier ExecutorService
, fournit entre autres choses des utilitaires pratiques pour gérer les threads et la concurrence.
Pour les tâches à granularité fine et intensives en termes de calculs, l'infrastructure de jointure de fourche de JDK7 sera utile.
Avant de commencer ce code difficile, vous voudrez peut-être vérifier si cela en vaut la peine. Pouvez-vous faire d'autres optimisations qui ne nécessitent pas une utilisation de thread à grande échelle? Est-ce la latence d'E/S que vous essayez de gérer? S'il est gourmand en ressources processeur, il n'y a pas grand intérêt à utiliser beaucoup plus de threads que ce que vous avez dans le matériel.
Je ne sais pas dans quel état de développement de votre projet est en cours, depuis votre relevé de problème est assez limité, mais vous voudrez peut-être envisager d'obtenir avoir un regard sur le projet de fourche se joindre à venir en JDK7: http://www.ibm.com/developerworks/java/library/j-jtp11137.html
Il y a beaucoup à gagner & apprendre de regarder cela, et puisque tout est open source, vous pouvez déjà télécharger le code comme un correctif et essayer de travailler avec elle.
(peut-être pas applicable pour tout ce que vous devez mettre en œuvre en ce moment, mais en valeur un regard non moins si vous avez l'intention de développer/maintenir votre application pendant un certain temps dans l'avenir)
Par "Donnez-leur des emplois" Je suppose que vous parlez de vos données qui les traverse? Qu'est-ce qui est impliqué dans "leur donner de nouveaux emplois"? – user142350
Dans cette économie, même les fils éprouvent des difficultés à trouver un emploi. . . – Gandalf