Soy bastante nuevo en Java y mi experiencia se limita a las aplicaciones basadas en web que se ejecutan en un contenedor web (Jboss en mi caso).
¿Estoy en lo cierto al decir que para las aplicaciones web el contenedor web se encarga de subprocesos múltiples? Si es así, ¿puedo introducir nuevos pasos en aplicaciones basadas en web? ¿Hay alguna ventaja en hacerlo y en qué escenario se necesitaría hacer eso?
java
web-applications
multithreading
kapricanon
fuente
fuente
Concurrency Utilities
.Respuestas:
La mayoría de los servidores web (Java y otros, incluido JBoss) siguen un modelo de "un subproceso por solicitud", es decir, cada solicitud HTTP es procesada completamente por exactamente un subproceso. Este hilo a menudo pasará la mayor parte del tiempo esperando cosas como solicitudes de DB. El contenedor web creará nuevos hilos según sea necesario.
Algunos servidores (en el ecosistema de Java principalmente Netty ) realizan el manejo de solicitudes asíncronas, ya sea con un modelo de "un subproceso hace todo" o algo más complejo. La idea básica es que tener muchos hilos en espera desperdicia recursos, por lo que trabajar de forma asincrónica puede ser más eficiente.
Es posible, pero debe hacerse con mucho cuidado, ya que los errores (como pérdidas de memoria o falta de sincronización) pueden causar errores que son muy difíciles de reproducir, o derribar todo el servidor.
Bueno, la ventaja es que puedes hacer cosas en paralelo. El uso de hilos para mejorar la velocidad computacional pura es algo que no debe hacer en un servidor web, ya que ralentizaría el manejo de otras solicitudes. Ese tipo de cosas debe hacerse en un servidor separado, probablemente utilizando algún tipo de cola de trabajo.
Un escenario legítimo para subprocesos múltiples en el contexto del manejo de una solicitud HTTP podría ser si necesita acceder a otros recursos de la red, por ejemplo, llamar a varios servicios web diferentes. Si lo hace de una sola vez, debe esperar a que finalice cada llamada. Pero si usa varios hilos, el tiempo de espera total es solo el retraso de la llamada más lenta.
fuente
En respuesta a tu pregunta:
No es diferente Por lo general, las aplicaciones web de software en las que se basa proporcionarán algunos subprocesos múltiples al hacer que cada nueva solicitud sea un hilo. Por puede usar / crear hilos como lo haría con cualquier otra aplicación.
De hecho, los subprocesos múltiples pueden proporcionarle un aumento drástico del rendimiento si lo usa correctamente. Para las tareas intensivas de E / S, como el acceso a la red y el acceso a la unidad de disco, casi siempre se garantiza el aumento del rendimiento. Para tareas computacionalmente intensivas, debe atenerse a la regla de un subproceso por núcleo en el servidor. Por ejemplo, si su núcleo tiene un procesador i7, debe atenerse a 7 hilos para realizar tareas computacionales.
En respuesta a tu pregunta:
Michael Borgwart dice que no debes hacer esto para mejorar la velocidad computacional. No estoy de acuerdo, ya que este artículo sugiere que los subprocesos múltiples pueden ayudar a proporcionar capacidad de respuesta cuando los usuarios necesitan una tarea computacionalmente pesada. En inglés simple, los usuarios no tendrán que esperar tanto tiempo para completar tareas computacionalmente pesadas con subprocesos múltiples.
Si tiene la intención de usar muchos hilos, sugiero el uso de un grupo de hilos. Esto reducirá la sobrecarga de crear hilos.
fuente
Bueno, esta es una buena pregunta y creo que la mayoría de los desarrolladores que trabajan en el desarrollo de aplicaciones web no utilizan el subprocesamiento múltiple explícitamente. El motivo es bastante obvio ya que está utilizando un servidor de aplicaciones para implementar su aplicación, el servidor de aplicaciones administra internamente un grupo de subprocesos para las solicitudes entrantes.
Entonces, ¿por qué usar multihilo explícitamente? ¿Qué necesita un desarrollador de aplicaciones web para exponerse a subprocesos múltiples?
Cuando trabaja en una aplicación a gran escala donde tiene que procesar muchas solicitudes al mismo tiempo, es difícil atender cada tipo de solicitud de forma síncrona porque un tipo particular de solicitud podría haber estado procesando mucho, lo que podría reducir el rendimiento de su aplicación.
Tomemos un ejemplo en el que una aplicación web después de atender un tipo particular de solicitud tiene que notificar a los usuarios por correo electrónico y SMS. Hacerlo sincrónicamente con el hilo de solicitud podría reducir el rendimiento de su aplicación web. Entonces aquí viene el papel de mutlithreading. En tales casos, es aconsejable desarrollar una aplicación multiproceso independiente a través de la red que sea responsable de enviar correos electrónicos y SMS únicamente.
fuente