2009-10-03 6 views
3

J'ai une sorte de problème complexe comme ci-dessous. - nous avons un système en temps réel avec un grand nombre de threads requis. Afin d'optimiser les performances, nous envisageons de suivre le design.gérer le sommeil dans le service exécuteur programmé java

  • créer un exécuteur de pool de threads avec le nombre maximum de fils
  • chaque fil est utilisé pour créer un service régulier de l'exécuteur.
  • maintenant les tâches sont affectés à ces services d'exécuteur testamentaire uniformément en fonction de la charge

  • mais le plus gros problème est, si l'une des tâches dans la file d'attente contient un sommeil (pendant quelques secondes), il bloque le correspondant Planifiez le thread du service d'exécution pour cette durée et, par la suite, toutes les tâches suivantes dans cette file d'attente. À cet égard, s'il vous plaît me suggérer comment suspendre l'exécution de la tâche avec le sommeil OU en surchargeant le sommeil en quelque sorte et rejoindre/planifier la tâche à nouveau dans la file d'attente.

Merci à l'avance Seshu

+0

Les exécuteurs exécutent généralement des tâches plus petites. Est-ce que votre tâche plus petite a besoin de dormir pendant plusieurs secondes. cela semble qu'il pourrait y avoir des problèmes de conception là-bas. –

Répondre

1

En supposant que je comprends votre question, vos fils de service de planification de Executor ont une exigence de délai, mais les travailleurs réels peuvent dormir pour une durée inconnue, jeter éventuellement hors du temps des exécuteurs de l'annexe. À partir de votre description, je suppose que ce que vous voulez, c'est que la tâche qui doit s'interrompre s'arrête, enregistre les informations de progression et se remet en place pour que le reste du travail soit reprogrammé ultérieurement. Vous devez intégrer cela dans l'architecture de votre application. Vous pouvez également faire en sorte que les threads du planificateur lancent les tâches de travail dans leurs propres threads séparés, en les laissant dormir selon les besoins, avec un thread de planificateur collectant toutes les terminaisons de travail.

Pour obtenir une meilleure réponse, vous devrez fournir plus d'informations sur ce que vous essayez d'accomplir.

1

Les tâches inactives sont inhérentes à l'exécution dans tout type de pool de threads limité. Le sommeil indique explicitement au thread qu'il ne doit rien faire pendant un certain temps.

Si possible, divisez la tâche en 2 (ou plus), en éliminant complètement le sommeil. Obtenez la première demi-tâche pour planifier la deuxième tâche avec un délai approprié. A défaut, vous pourriez envisager d'augmenter la taille de votre pool de threads - soit en plaçant une taille beaucoup plus grande à sa taille, ou même en éliminant la casquette (pas recommandé pour un serveur qui pourrait se retrouver avec de nombreux clients) .

Vous pouvez également déplacer les tâches contenant des instructions sleep dans leur propre programme d'exécution programmé. Ensuite, ils se retarderont mutuellement, mais les tâches mieux exécutées, sans aucune attente, recevront un traitement préférentiel.

Questions connexes