Question

Voici la version simplifiée de mon besoin

J'ai une classe java, par exemple, Processeur contenant une méthode, telle que bigProcess (). Tout ce qu'elle fait est de se connecter à un serveur de fichiers, télécharger le fichier spécifié une fois que cela est fait, enregistrer le fichier dans la base de données, puis mettre à jour certains champs de la base de données. dans différents tableaux.

Pour chacune des sous-tâches comme le fichier téléchargé, enregistrez dans la base de données, mettez à jour les champs dans le fichier t1, etc., il utilise différentes méthodes.

La classe de processeur est appelée toutes les 2 heures et doit traiter environ 30 à 40 demandes pour chaque appel. Pour améliorer les performances, je prévois de créer un nouveau thread pour chaque demande (30 à 40 threads ici) et chaque thread appelle la méthode bigProcess.

Maintenant, ma question est la suivante: dois-je synchroniser les blocs de code de la méthode bigProcess () (ici, je suis inquiet à propos des méthodes de mise à jour des champs. Certaines des méthodes de mise à jour sont verrouillées sur une ligne telle que selecte f1, f2, f3 t1 pour la mise à jour, définit les valeurs des champs f1, f2 & amp; f3 et publie la validation)

REMARQUE: la méthode bigProcess () n'utilise aucune variable d'instance de la classe Processor.

Était-ce utile?

La solution

Faites de BigProcess un Appelable . Lorsque vous le soumettez à un Exécuteur ou ExecutorService , vous récupérez un Future . Si vous future.get () dans les threads 30 à 40, ces threads bloquera jusqu'à la fin du Callable . Ou si Callable est terminé, ils renverront immédiatement le résultat.

Une autre façon de faire (que j'aime bien) est de créer un pool de threads et de soumettre tout le travail au pool de threads. Une fois que tout le travail est soumis, arrêtez et attendez la fin. Cela ressemble à quelque chose comme ça:

ExecutorService threadPool = Executors.newFixedThreadPool(40);
// submit work
threadPool.shutdown();
try {
  threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
  // do something
}

Si vous avez un travail dépendant (la tâche B ne peut pas être exécutée tant que la tâche A n'est pas terminée), créez la tâche B avec un Future à partir de la tâche A, etc.

.

J'aime cette approche car tout est transitoire. Pour un seul chargement à partir de la base de données, tous les processus seront créés, exécutés et jetés. Lorsque vous commencez à créer un pool de threads persistant, vous introduisez un autre problème potentiel et il est plus difficile de comprendre ce qui se passe.

Autres conseils

La nécessité de synchroniser vos méthodes dépend de ce que ces méthodes font réellement. En règle générale, vous devez effectuer une synchronisation si des ressources utilisées par plusieurs threads sont utilisées, telles qu'un seul fichier ou une seule table dans une base de données (à partir de laquelle vous écrivez et lisez en réalité). Si tous les processus que vous exécutez n'interfèrent pas les uns avec les autres, la synchronisation n'est pas nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top