2012-10-07 4 views
3

Si j'ai 3 tâches que je veux exécuter tous simultanément, il y a deux façons dont je pense à présent.Java multithread vs Shell script

Depuis que je cours le programme sous Linux, je pourrais le faire dans un script shell.

java Task1 & 
    java Task2 & 
    java Task3 & 

ou, je pourrais utiliser un programme java pour frayer trois fils de l'enfant pour effectuer les tâches.

Je veux savoir quel est le moyen le plus efficace. Je doute que le shell crée une instance JVM multiple?

+7

Bien sûr, le script shell créera plusieurs instances JVM - c'est ce que vous lui dites de faire. Si les tâches que vous essayez d'accomplir sont indépendantes (elles ne nécessitent pas de communication les unes avec les autres), le script shell est le plus simple (et celui qui a le plus de sens). – Cubic

+1

Pour plus d'efficacité cela dépend de ce que vous entendez par efficace - moins de mémoire, espace d'échange, temps d'exécution, accès au disque, temps de programmation, sécurité etc .... et aussi ce que fait le code – Mark

+0

Rappelez-vous que si vous le faites avec plusieurs threads dans une JVM, vous allez avoir des variables statiques et similaires partagées entre les threads. Sans connaître votre demande, je ne peux pas dire si ce serait un problème, mais c'est quelque chose que vous devez considérer. Si vous avez trois JVM distinctes, chacune aura ses propres variables statiques. –

Répondre

2

Si les tâches sont exécutées depuis longtemps, les frais généraux de trois JVMs est négligeable:

  • Les temps de chargement/accès disque est sans problème en raison de la mise en cache du système de fichiers.
  • La mémoire de la bibliothèque partagée est singleton dans le noyau Linux. Je suppose que Java utilise des garbage collector par threads résultant en la même quantité de mémoire par défaut allouée pour trois threads par rapport à trois JVM (à l'exception de la mémoire de métadonnées JVM minimale).
  • Il est également bien connu que Linux est très efficace dans la planification des processus, ce qui rend les fourches indépendantes d'un démon au moins aussi efficaces que plusieurs threads. Sous Windows, nous avons une situation différente où l'instanciation de processus est une opération coûteuse.

Avec une longue période, je me réfère à 30 secondes par tâche. Maintenant, qu'en est-il des tâches à court terme? Ici, le gain de temps n'est important que si la tâche est répétée très souvent. Les passages répétés ont un temps système beaucoup plus petit pour (re) charger la JVM, mais il y en aura toujours qui resteront.

Verdict: Utilisation du script shell est beaucoup plus facile à mettre en œuvre, moins de code à écrire et maintenir und beaucoup plus configurable sans écriture de code encore plus. Et pendant l'exécution, dans un scénario commun, vous n'observez pas de grandes différences entre les deux approches.

4

Il serait plus efficace de le faire en Java, de faire votre programme multithread et d'utiliser trois threads. Oui, le shell créera trois instances JVM. Mais la question est: pourquoi devriez-vous envisager une alternative plutôt qu'une autre? Si ce n'est qu'une petite tâche de toute façon, personnellement, je commencerais simplement trois instances dans le shell comme vous l'avez fait.

+2

Il pourrait prendre plus de temps à programmer et être plus sujet aux erreurs, ce qui pourrait être la façon dont l'efficacité est mesurée. – Mark

0

La façon dont vous le faites lance maintenant trois instances JVM distinctes, chacune dédiée à une tâche. Si vous souhaitez exécuter simultanément les trois tâches sur une machine virtuelle Java, vous devez créer des objets Thread pour ces machines. Je voudrais donc créer un programme Java très simple qui lancerait ces tâches dans son propre thread. Ensuite, je voudrais convertir ce programme en un fichier .jar et le programmer pour l'exécution.

+0

Comment savez-vous comment vous allez résoudre le problème si vous ne savez même pas ce qu'il veut faire exactement? Pour tout ce que nous savons, il pourrait essayer d'exécuter un serveur http avec un client sudoku. – Cubic

+1

@Cubic Il a demandé la différence entre les deux, et j'ai essayé de répondre. Le reste dépend de lui pour comprendre. Ou il peut éditer la question ou en demander une nouvelle si l'affaire n'est toujours pas claire pour lui. –

0

Plus JVM est le plus de temps CPU. Puisque trois Thread sur une JVM serait mieux. Mais il vaut la peine de faire un test de benchmarking simple. Si vous le faites, s'il vous plaît partagez-le avec nous.

0

Je veux savoir quel est le moyen le plus efficace.

Si vous restreignez juste vos critères pour décider de l'efficacité du processeur, l'approche de threads Java est très probablement plus efficace. Les frais généraux d'exécution des machines virtuelles Java supplémentaires en termes de démarrage de la machine virtuelle Java et d'utilisation de la mémoire seront appréciables. Les seuls scénarios dans lesquels la version multithread pourrait être plus lente impliquent soit une concurrence entre les tâches pour une ressource donnée, soit un mauvais choix d'options d'accord JVM; par exemple. si vous faites le tas trop petit.

Cependant, je ne pense pas que la décision uniquement sur la base de l'efficacité du processeur est sage:

  • Si les tâches sont longues en marche et vous avez assez de mémoire pour les 3 JVMs, la différence de performance (en termes de pourcentage) pourrait être insignifiant. (Qui se soucie si vous prenez 10 secondes de plus pour démarrer les JVMs si la totalité du cycle prend 10 heures!)

  • Vous devez également prendre en compte le temps de développement, les tests et la maintenance. Votre réflexion doit prendre en compte la complexité potentielle de l'écriture d'une application multi-thread robuste. (Et je ne peux pas prédire que, sans plus de détails sur les exigences fonctionnelles et non fonctionnelles de votre système.)

En résumé, il n'y a pas de bonne réponse définitive sans plus de détails sur votre problème, etc


Je doute que le shell crée une instance JVM multiple?

Mauvais. va créer plusieurs instances JVM.