In che modo il multithreading è diverso in un'applicazione Web basata su Java o in un'applicazione Java autonoma

12

Sono abbastanza nuovo in Java e la mia esperienza è limitata alle applicazioni basate su Web in esecuzione su un contenitore Web (Jboss nel mio caso).

Ho ragione nel dire che per le applicazioni Web il web container si occupa di multi-threading? In tal caso, posso introdurre nuovi gradini in un'applicazione basata sul Web? C'è qualche vantaggio nel farlo e in quale scenario bisognerebbe farlo?

    
posta kapricanon 12.06.2013 - 14:44
fonte

3 risposte

20

Am I correct in saying that for Web Applications the web container takes care of multi-threading?

La maggior parte dei server web (Java e non, incluso JBoss) seguono un modello "un thread per richiesta", cioè ogni richiesta HTTP viene completamente elaborata da esattamente un thread. Questa discussione spesso impiega la maggior parte del tempo ad aspettare cose come richieste DB. Il contenitore web creerà nuovi thread, se necessario.

Alcuni server (nell'ecosistema Java principalmente Netty ) eseguono la gestione asincrona delle richieste, con un modello "un filo fa tutto" o qualcosa di più complesso. L'idea di base è che avere un sacco di thread in attesa spreca risorse, quindi lavorare in modo asincrono può essere più efficiente.

If so, can I introduce new treads in a Web Based applications?

È possibile, ma dovrebbe essere fatto con molta attenzione, dal momento che errori (come perdite di memoria o sincronizzazione mancante) possono causare bug che sono molto difficili da riprodurre o far cadere l'intero server.

Is there any advantage in doing so and in what scenario one would need to do that?

Bene, il vantaggio è che puoi fare cose in parallelo. L'uso di thread per migliorare la pura velocità di calcolo è qualcosa che dovresti non fare su un server web, poiché rallenterebbe la gestione di altre richieste. Questo tipo 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 devi accedere ad altre risorse di rete, ad es. chiama diversi servizi web. Se lo fai in un singolo thrad, devi aspettare che ogni chiamata finisca a turno. Ma se usi più thread, il tempo di attesa totale è solo il ritardo della singola chiamata più lenta.

    
risposta data 12.06.2013 - 15:14
fonte
2

In risposta alla tua domanda:

How is multi-threading different in a Java based Web Application vs Stand-alone Java Application

Non è diverso. Solitamente le applicazioni web del software sono costruite in quanto forniranno già del multi-threading rendendo ogni thread una nuova richiesta. Puoi usare / creare discussioni proprio come faresti con qualsiasi altra applicazione.

Infatti il multi-threading può darti drastici aumenti delle prestazioni se lo usi bene. Per le attività di I / O intensive come l'accesso alla rete e l'accesso alle unità disco, l'aumento delle prestazioni è quasi sempre garantito. Per attività computazionalmente intensive dovresti rispettare la regola di un thread per core nel server. Ad esempio, se il tuo core ha un processore i7, dovresti limitarti a 7 thread per eseguire attività di calcolo.

In risposta alla tua domanda:

Is there any advantage in doing so and in what scenario one would need to do that?

Michael Borgwart dice che non dovresti farlo per migliorare la velocità di calcolo. Non sono d'accordo, poiché l'articolo questo suggerisce che il multi-threading può aiutare a fornire reattività quando gli utenti hanno bisogno di un pesante calcolo computazionale compito fatto. In parole povere, gli utenti non devono attendere il tempo necessario per completare compiti computazionalmente pesanti con il multi-threading.

Se hai intenzione di utilizzare molte discussioni, ti suggerisco di utilizzare un pool di thread. Ciò ridurrà il sovraccarico di creazione dei thread.

    
risposta data 14.10.2013 - 17:13
fonte
0

Questa è una bella domanda e penso che la maggior parte degli sviluppatori che lavorano nello sviluppo di applicazioni web non utilizzi il multithreading in modo esplicito. Il motivo è abbastanza ovvio poiché si utilizza un server applicazioni per distribuire l'applicazione, il server delle applicazioni gestisce internamente un pool di thread per le richieste in entrata.

Allora perché usare il multithreading in modo esplicito? Che cosa è necessario che uno sviluppatore di applicazioni web si esponga al multithreading?

Quando lavori su un'applicazione su larga scala in cui devi richiedere molte richieste contemporaneamente è difficile servire ogni tipo di richiesta in modo sincrono perché un particolare tipo di richiesta avrebbe potuto fare un sacco di elaborazione che poteva ridurre le prestazioni della tua applicazione.

Facciamo un esempio in cui un'applicazione web dopo aver scontato un particolare tipo di richiesta deve informare gli utenti tramite e-mail e SMS. Farlo in modo sincrono con il thread di richiesta potrebbe ridurre le prestazioni della tua applicazione web. Quindi ecco che arriva il ruolo del mutlithreading. In questi casi è consigliabile sviluppare un'applicazione multithread stand-alone sulla rete che è responsabile solo dell'invio di e-mail e SMS.

    
risposta data 16.05.2015 - 23:04
fonte

Leggi altre domande sui tag