2009-08-19 8 views
0

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

+0

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

+1

Dans cette économie, même les fils éprouvent des difficultés à trouver un emploi. . . – Gandalf

Répondre

1

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); 
     } 
    } 
+0

Pouvez-vous me donner un échantillon? – firstthumb

3

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

0

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.

1

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)