Il existe une foule de réponses à ce sujet, mais cela peut être déroutant. J'aime penser de cette façon, et peut-être que ça aide ?:
La programmation concurrente est un code qui ne se soucie pas de l'ordre d'exécution. Java est un langage médiocre pour la programmation simultanée, mais il existe des bibliothèques et des frameworks pour vous aider. JavaScript est un excellent langage pour la programmation concurrente, et il est souvent difficile de vouloir écrire quelque chose qui n’est pas simultané (par exemple, si vous voulez forcer l’ordre d’exécution). La programmation simultanée est idéale pour la programmation événementielle (l'ordre d'exécution étant déterminé par les écouteurs d'événements, comme le code exécuté dans votre navigateur qui agit lorsque vous cliquez sur un bouton ou tapez dans une zone).
Un exemple pourrait inclure la création d'une centaine de requêtes HTTP. Dans NodeJS, la solution la plus simple consiste à ouvrir toutes les 100 demandes en même temps avec une méthode de rappel. Lorsque les réponses sont renvoyées, une méthode est exécutée à chaque fois. C'est la programmation concurrente. Dans Ruby, la solution la plus simple (la plus courante) consiste à ouvrir une demande et à gérer la réponse, à ouvrir la demande suivante et à gérer la réponse, etc. Pour de nombreuses demandes, NodeJS est plus facile à effectuer de Veillez à éviter de taper sur le serveur ou de maximiser vos connexions sortantes (facile à faire par erreur). Vous pouvez écrire le Ruby de manière concurrente, mais ce n'est pas la façon dont la plupart du code Ruby est écrit, et cela fait un peu mal de le faire.
Programmation parallèleCe code peut être exécuté simultanément dans plusieurs threads ou processus. Cela vous permet d'optimiser les performances en exécutant le code sur plusieurs processeurs (y compris souvent plusieurs machines, comme avec Akka). Parce que NodeJS n'est pas multi-thread et qu'il n'y a pas d'exécution parallèle, vous n'avez pas à vous soucier d'écrire du code threadsafe (et la plupart du code JavaScript que j'ai vu n'est pas threadsafe). En Java, même si le langage ne fait pas de la programmation simultanée le modèle normal, la programmation parallèle est très intégrée et vous devez souvent vous soucier de la sécurité des threads. Si vous écrivez un site Web en Java, celui-ci sera généralement exécuté dans un conteneur qui exécute chaque demande dans un thread distinct de la même mémoire.
Certains des éléments ci-dessus dépendent de la portée et des limites dont vous parlez. Je travaille sur des sites Web. La plupart du code Java que je vois n'est pas une programmation concurrente. Bien sûr, si vous effectuez un zoom arrière suffisant, l'ordre dans lequel les demandes du client sont entrées n'a pas d'importance, mais si vous effectuez un zoom avant, l'ordre d'exécution des tâches est dicté par le code. Mais le code est écrit pour que les requêtes puissent s'exécuter en parallèle avec de nombreux objets partagés devant être thread-safe.
Entre-temps, la plupart du code JavaScript que je vois est concurrent: il est écrit de manière à ce que l'ordre d'exécution soit sans importance à plusieurs niveaux. Mais il n'est pas écrit pour prendre en charge l'exécution parallèle dans la mémoire partagée. Bien sûr, vous pouvez exécuter le même code en parallèle sur plusieurs processus, mais les objets ne sont pas partagés. Il ne s'agit donc pas d'une programmation parallèle significative.
Pour des lectures supplémentaires, j'aime beaucoup les illustrations dans la réponse du haut à cette question ici: https://www.quora.com/What-are-the-differences-between-parallel-concurrent-and-asynchronous-programming