Ho ragione nel dire che per le applicazioni Web il contenitore web si occupa del multi-threading?
La maggior parte dei server web (Java e altro, incluso JBoss) segue un modello "un thread per richiesta", ovvero ogni richiesta HTTP viene elaborata completamente da un solo thread. Questo thread spesso passa la maggior parte del tempo ad aspettare cose come richieste DB. Il contenitore Web creerà nuovi thread se necessario.
Alcuni server (principalmente nell'ecosistema Java Netty ) eseguono la gestione asincrona delle richieste, con un modello "un thread fa tutto" o qualcosa di più complesso. L'idea di base è che avere molti thread in attesa spreca risorse, quindi lavorare in modo asincrono può essere più efficiente.
In tal caso, posso introdurre nuovi gradini in applicazioni basate sul Web?
È possibile, ma dovrebbe essere fatto con molta attenzione, poiché errori (come perdite di memoria o sincronizzazione mancante) possono causare bug che sono molto difficili da riprodurre o far cadere l'intero server.
C'è qualche vantaggio nel farlo e in quale scenario si dovrebbe fare questo?
Bene, il vantaggio è che puoi fare cose in parallelo. Usare i thread per migliorare la pura velocità computazionale è qualcosa che non dovresti fare su un server web, poiché rallenterebbe la gestione di altre richieste. Questo genere di cose dovrebbe essere fatto su un server separato, probabilmente usando una sorta di coda di lavoro.
Uno scenario legittimo per il multithreading nel contesto della gestione di una richiesta HTTP potrebbe essere se è necessario accedere ad altre risorse di rete, ad esempio chiamare diversi servizi Web diversi. Se lo fai in un singolo thrad, devi aspettare che ogni chiamata finisca a sua volta. Ma se si utilizzano più thread, il tempo di attesa totale è solo il ritardo della singola chiamata più lenta.
Concurrency Utilities
.